A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hbk000 中级黑马   /  2015-4-4 00:27  /  1011 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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
有什么可以说的通的理由么?

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1 赞一个!

查看全部评分

17 个回复

倒序浏览
==比较的地址值, s4+s5是一个新的字符串    地址值肯定与S3不同
回复 使用道具 举报
变量,就是值不确定,不确定的值,如何得知相加的结果呢,所以JVM无法识别

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

点评

顶一个  发表于 2015-4-7 10:54

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1 很给力!

查看全部评分

回复 使用道具 举报 1 0
第一个为相同的地址值,第二个变成新的字符串地址值是不同的了
回复 使用道具 举报
以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的最大取值,此时编译通过。

结论:变量相加,无法识别到计算后的结果,所以按照默认类型来处理。
常量相加,会识别到运算后的结果。
回复 使用道具 举报 1 0
好问题,学习了。。
回复 使用道具 举报
JVM不确定是因为String在做连接运算若是变量(指向字符串对象的变量)连接,运算结果在编译期间是不能确定的它值的。所以才说JVM不识别!
回复 使用道具 举报
比的是地址。。。。。。
回复 使用道具 举报
Lois 中级黑马 2015-4-4 19:37:45
9#
顶一个                                 
回复 使用道具 举报
好问题,好回答
回复 使用道具 举报
字符串能用==么?我要去试试
回复 使用道具 举报
==是比较地址值的,就是说他们的地址值是要相同,相同的话才会返回true,否者为false,第一个是字符串相加,相加之后他会在字符串常量池找,找到“你好吗”,因为s3就是,所以可以,而第二个则是用变量名运算相加,这样的话他们在内存中就会重新开辟一个空间,那么他们的地址值就不同了,所以是false
回复 使用道具 举报
努力!加油!
回复 使用道具 举报
String s3 = "你好吗";
String s4 ="你";
String s5 ="好吗";
System.out.println(s3==("你"+"好吗"));//这个是true
System.out.println(s4+s5==s3);//这个是false
字符串是引用类型,==对于引用类型来说是比较地址,首先,字符串对象是常量,一旦初始化就不能被改变。
“你”+“好吗”计算后得到字符串“你好吗”,这个字符串在内存中已经有了,所以引用的是s3的地址,所以为true。而第二个两个变量相加java无法预知相加后和s3的值是否一样,所以要先开辟空间,再来存储计算后的结果。

回复 使用道具 举报
都错了吧, String字符串 实际上是个字符数组,System.out.println(s4+s5==s3);//这个是false ,两个数组相加比较一个数组, 不管比值还是地址值都是错的, 你可以看看 String 类中的底层代码
回复 使用道具 举报
s4+s5 其实不是等于s3   应该等于s6,也就是说内存空间地址部是指向s3  是另开辟一块内存地址,因为JVM不认识你的字符串,每个字符串都是一个空间地址,假如北京+上海==广州吗?答案肯定不等于。不知道楼主懂我说的不?
回复 使用道具 举报
恩,看了回复,受教了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马