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

如题所述

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

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

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

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

2、用==比较和用equals比较的区别:
对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同.
“==”比较两个变量本身的值,即两个对象在内存中的首地址.
“equals()”比较字符串中所包含的内容是否相同.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-03-02
abc
false

String类里的无论是substring方法还是replace方法都会返回一个新的字符串,因此s是不会变的;
new String("abc")也会产生一个新的字符串变量,只是内容是abc,和变量s相同,而s==value比较的是二者的内存地址,java中每产生一个新的变量就会分配一个新的内存地址,因此二者相等是false
第2个回答  2015-03-02
abc
false
String类是一个final类,对象被创建后就不能修改,==比较的是两个变量的引用对象是否是同一个,而不是对象的属性是否相同,判断两个对象是否相等应该用equals方法本回答被网友采纳
第3个回答  2015-03-02
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
第4个回答  2015-03-02
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
相似回答