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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一直很安静 中级黑马   /  2013-11-23 17:38  /  1421 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s="a"+"b";
System.out.println(s=="ab");
结果为什么是true?不是每个字符串都是一个对象吗?且不会变 那我上面应该是两个对象啊?

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

6 个回复

倒序浏览
String s="a"+"b";这句代码是把s的指向变成了对象"ab"的内存地址,那么字符串常量池中就有"ab"这个对象了。
s=="ab",你这么判断,java虚拟机会到内存中找有没有"ab"这个对象,发现有,就不会创建"ab"对象了,然后再判断它们两个的内存地址是否相同,既然是一个对象,那么当然会返回true了。
回复 使用道具 举报
因为代码String s="a"+"b";的结果实际上就相当于String s = "ab";
此时变量s就已经指向字符串“ab”了,也就是“ab”的地址值已经赋给了s。
先不管第二条代码,此时s=="ab"就已经为true了。
那么再看第二条代码System.out.println(s=="ab");就肯定为true了。

评分

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

查看全部评分

回复 使用道具 举报

String类型对象的内容是不可变的...
String a = "a"+"b";这个语句的意思是相当于在堆内存中开辟了两块空间,它们里面存储的内容分别是a和b,然后又开辟了第三块空间,存储的内容是ab,再将此空间的堆内存引用地址指向对象s,所以最终打印的结果是true。

用下图就可以很好的理解了:

2013-11-23_180611.jpg (26.73 KB, 下载次数: 22)

2013-11-23_180611.jpg

点评

FFF
可惜你分太高了!不然一定有分的,那么好的回答。  发表于 2013-11-24 00:06

评分

参与人数 1黑马币 +9 收起 理由
FFF + 9

查看全部评分

回复 使用道具 举报
有图有真像
回复 使用道具 举报
FFF 金牌黑马 2013-11-24 00:41:04
地板
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
如果没有解决,可能你的问题问得不够清楚。可以重新发问的哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马