黑马程序员技术交流社区

标题: 关于字符串的一个疑问? [打印本页]

作者: hbk000    时间: 2015-4-4 00:27
标题: 关于字符串的一个疑问?
本帖最后由 hbk000 于 2015-4-5 00:22 编辑

String s3 = "你好吗";
String s4 ="你";
String s5 ="好吗";
System.out.println(s3==("你"+"好吗"));//这个是true
System.out.println(s4+s5==s3);//这个是false

老师讲的是变量相加 jvm 不确定值是多少 导致false
有什么可以说的通的理由么?
作者: Teresa    时间: 2015-4-4 00:31
==比较的地址值, s4+s5是一个新的字符串    地址值肯定与S3不同
作者: liyanghml    时间: 2015-4-4 01:26
变量,就是值不确定,不确定的值,如何得知相加的结果呢,所以JVM无法识别

再就是:==比较的是 内存地址值  s3   和  ("你"+"好吗") 指向同一个内存地址,结果为true
                                              s4+s5组成了一个新的字符串,值与s3相等, 但此时内存中有两个内存地址值不想等的,值相同的字符串,根据==规则,判断结果为false

作者: 黑马TYR    时间: 2015-4-4 01:57
第一个为相同的地址值,第二个变成新的字符串地址值是不同的了
作者: 夜班心桥    时间: 2015-4-4 10:03
以byte来举例吧:
byte a = 3;
byte b =4;
byte c = a + b;
byte d= 3 + 4;
byte c = a + b;这里编译不通过,因为在编译时期,编译器无法确定a和b相加后的结果是否超出了byte的取值范围,此时按照默认类型来处理,就把a和b的结果当做int来处理。所以,无法将int型的值赋给byte变量。
而byte d = 3+4;编译通过,在编译时期,编译器会识别到相加后的结果7,没有超过byte的最大取值,此时编译通过。

结论:变量相加,无法识别到计算后的结果,所以按照默认类型来处理。
常量相加,会识别到运算后的结果。
作者: zouxx    时间: 2015-4-4 10:50
好问题,学习了。。
作者: lwj123    时间: 2015-4-4 10:55
JVM不确定是因为String在做连接运算若是变量(指向字符串对象的变量)连接,运算结果在编译期间是不能确定的它值的。所以才说JVM不识别!
作者: 薛慧彬    时间: 2015-4-4 11:00
比的是地址。。。。。。
作者: Lois    时间: 2015-4-4 19:37
顶一个                                 
作者: 刚起步的小马驹    时间: 2015-4-4 21:37
好问题,好回答
作者: 涿郡丶二哥    时间: 2015-4-4 22:25
字符串能用==么?我要去试试
作者: 孙振祥    时间: 2015-4-4 23:07
==是比较地址值的,就是说他们的地址值是要相同,相同的话才会返回true,否者为false,第一个是字符串相加,相加之后他会在字符串常量池找,找到“你好吗”,因为s3就是,所以可以,而第二个则是用变量名运算相加,这样的话他们在内存中就会重新开辟一个空间,那么他们的地址值就不同了,所以是false
作者: 张红兴    时间: 2015-4-4 23:34
努力!加油!
作者: 快乐ABC    时间: 2015-4-4 23:38
String s3 = "你好吗";
String s4 ="你";
String s5 ="好吗";
System.out.println(s3==("你"+"好吗"));//这个是true
System.out.println(s4+s5==s3);//这个是false
字符串是引用类型,==对于引用类型来说是比较地址,首先,字符串对象是常量,一旦初始化就不能被改变。
“你”+“好吗”计算后得到字符串“你好吗”,这个字符串在内存中已经有了,所以引用的是s3的地址,所以为true。而第二个两个变量相加java无法预知相加后和s3的值是否一样,所以要先开辟空间,再来存储计算后的结果。


作者: 徐顺醒    时间: 2015-4-5 10:11
都错了吧, String字符串 实际上是个字符数组,System.out.println(s4+s5==s3);//这个是false ,两个数组相加比较一个数组, 不管比值还是地址值都是错的, 你可以看看 String 类中的底层代码
作者: 84489556    时间: 2015-4-5 10:21
s4+s5 其实不是等于s3   应该等于s6,也就是说内存空间地址部是指向s3  是另开辟一块内存地址,因为JVM不认识你的字符串,每个字符串都是一个空间地址,假如北京+上海==广州吗?答案肯定不等于。不知道楼主懂我说的不?
作者: Mr.Cai    时间: 2015-4-5 10:28
恩,看了回复,受教了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2