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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© @ne_pie尒ce 中级黑马   /  2013-11-17 12:17  /  1014 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s1= "a";
String s2= s1 + "b";
String s3= "a" + "b";
System.out.println(s2== "ab");
System.out.println(s3 == "ab");
为什么第一条打印为false,
第二条打印为true

点评

多逛论坛那吧,还有好多东西要学  发表于 2013-11-17 14:37

4 个回复

倒序浏览
判断字符串是否相等不能用==.
回复 使用道具 举报
本帖最后由 唐宋元明清 于 2013-11-17 12:46 编辑

首先你要清楚。
s1指向的是常量池pool中的对象“a”
s2指向的是堆内存中新生成对象“ab”
s3指向的是常量池中的对象"ab"
==这个符合比较的是引用地址
对象 "ab"这个常量在常量池中永远只有一个。并且s3指向了它;
而堆内存中"ab"可以是无数个,就看引用地址了,相同的引用地址那么就相等,否则就是不同的对象,但内容都是"ab。
s2=="ab" //s2指向的是堆内存中的对象,而"ab"这个常量是在常量池中所以比较结果是false
s3=="ab" //s3指向的是常量池中的对象指向的就是常量池中的"ab",所以返回的就似乎true

总结一下就是,如果加号两边的是字面值(字面值就是直接在”"里写的值,比如上面的”a”与”b”),那么将在pool里查找有没对应内容的对象(这里的内容就是”ab”),并返回pool里的对象.
如果加号两边不满足上面的条件(比如,两边的值是引用值或者堆里的字符串对象).那么将不会再pool里查找”ab”,而是直接在堆里生成一个新的对象…
回复 使用道具 举报
记住两点:
如果想比较两个字符串的地址是否相同,用“==”
如果想比较两个字符串的内容是否相同,用equal()方法
1.String s1= "a";这里s1在内存里开辟了一段空间赋值为a
String s3= "a" + "b";这里s3被赋值为ab,首先要在内存空间里寻找ab字段,如果没有,则新开辟一个地址进行存放,但内存里已经存在ab了,所以s3就指向s1的地址,s1==s3==“ab”比较的是地址,它们地址相同,所以返回true
2.s2的内容虽然也是ab,但其指向的地址并不与s1指向的“ab”相同,==号用来判断地址并不判断内容,所以s2==“ab”为fasle。


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马