关于java,String类,输出结果是啥?为啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于java,String类,输出结果是啥?为啥?相关的知识,希望对你有一定的参考价值。

public static void main(String[] args)

String s1 = "hello";
String s2 = "java";

show(s1,s2);

System.out.println(s1+"...."+s2);


public static void show(String s1,String s2)

s2.replace('a','o');
s1 = s2;

输出:hello ....java
原因:学过c的都知道,自定义的函数中形参的变化不会改变实参的内容,除非有返回值或直接引用实参地址。
参考技术A 输出hello....java
其实很容易受C++的引用影响,如果是C++的话,就应该两个是一样的。但是这里没有返回值,所以s1,s2都不会变。追问

show(s1,s2);之后不是已经把s2赋值给s1了吗?跟返回值有什么关系。

追答

s1,s2在下面的函数里面仅仅是参数而已,s1,s2本身没有变化。

以下Java代码执行结果是啥,请详细分析为啥?

第一行输出结果是abc:
原因是:
s.substring(1);
s.replace("bc", "xyz");
这两句话没有任何作用 ~因为String是属于值传递~

第二行 输出结果是false:
原因是:
用==比较字符串,是比较两个变量本身的值,即两个对象在内存中的首地址。用equals比较就会为true,equals比较的是内容是否相同。

附:
1、值传递、引用传递的区别:
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。

引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数

2、用==比较和用equals比较的区别:
对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同.
“==”比较两个变量本身的值,即两个对象在内存中的首地址.
“equals()”比较字符串中所包含的内容是否相同.
参考技术A abc
false

String类里的无论是substring方法还是replace方法都会返回一个新的字符串,因此s是不会变的;
new String("abc")也会产生一个新的字符串变量,只是内容是abc,和变量s相同,而s==value比较的是二者的内存地址,java中每产生一个新的变量就会分配一个新的内存地址,因此二者相等是false
参考技术B abc
false
String类是一个final类,对象被创建后就不能修改,==比较的是两个变量的引用对象是否是同一个,而不是对象的属性是否相同,判断两个对象是否相等应该用equals方法
参考技术C abc
false
你之前的
s.substring(1);
s.replace("bc", "xyz");都没有赋值给s,所以s的值是不变的。
如果你这样写的话
s=s.substring(1);
s=s.replace("bc", "xyz");
s输出的是xyz

还有为什么是false呢?
==这个指的是是否是同一个对象,你后来的value是new的,就是重新见了一个对象,s和value是两个对象,所以不相等
如果你用s.equals(value),这个返回的是true,因为他们比较的是值是否相等,值都是“abc”,所以返回true
参考技术D abc
false
输出abc是因为:s.substring(1)语句只是将s串进行了截取,将截取的结果进行返回,但是并没有改变s串;s.replace("bc","xyz")语句是将s串中的bc部分替换为xyz并将结果返回,也没有改变s串。两个语句虽然都有返回值,但是没有左值,也就是没有用变量接收这个返回值。
输出false是因为s==value,虽然s串和value串中的字符都相同,但是还是两个字符串。String s="abc"语句在字符串池中产生了一个"abc"串,String value=new String("abc");也同意在字符串池中产生了一个"abc"串,两个字符串是同时存在于字符串池中的,所谓的字符串池可以理解为内存中的一个部分专门用来存放字符串的地方。既然是有两个相同的字符串在内存中,那么它们的地址就是不一样的,而s==value中的比较运算符==比较的就是字符串的地址,准确来说应该是通过比较两个字符串的哈希码,所谓的哈希码就是通过hash算法使用字符串的内存中地址计算得到的结果。既然两者的地址不同,那么hash算法得到的哈希码也是不一样的,所以就是false

以上是关于关于java,String类,输出结果是啥?为啥?的主要内容,如果未能解决你的问题,请参考以下文章

【java】-关于String的使用以及其输出结果的问题

Java在指定目录中创建文件,为啥输出不是C:\JavaTemp.javatemp? 文件名后面的数字是啥意思?求指点。

java中new的用法,这个输出结果是啥意思?

Java中为啥有些变量后面有.length,是啥意思?

关于java工具类的理解 为啥java要提出个工具类的概念,按照面向对象的思想为啥不直接把工具

c++中的String类,为啥直接用于cout就能输出?它里面包含了啥?