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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© RichardM 中级黑马   /  2015-7-5 14:39  /  439 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面关于字符串的题(模样长得差不多),结果不同是为什么:
                String s1 = "a";
                String s2 = "b";
                String s3 = "ab";
                System.out.println(s3 == s1 + s2); // false
                System.out.println(s3 == "a" + "b"); // true

5 个回复

倒序浏览
s3 == s1 + s2;
s1 + s2 是两个实例相结合
s3 == s1 + s2;比较的是两个实例他们的地址值是不相等的
回复 使用道具 举报
对字符串比较来说,首先要区别==和equals,==表示比较的两个对象在堆中的物理地址一致且值相等。equals只需要值相等。
对于你的问题。
1.System.out.println(s3 == s1 + s2); // false
s1+s2后他会在堆中划开一块新的物理地址,然后值是“ab”,而它与s3的比较是==,因为值相等,但是在堆中的物理地址不一致,所以返回false。
2.System.out.println(s3 == "a" + "b"); // true
“a”+"b"这涉及到字符串池的问题“a”+“b”他会去堆中的字符串池中寻找一下是否有开辟过"ab",因为你声明的时候写了String s3 = "ab";这就代表你之前在堆中有了这块内容了他就不再从新开辟新空间了,而是指向这块空间。而恰好这块空间在物理地址上和s3一致且值相等,所以返回true

回复 使用道具 举报 1 0
一楼总结的很到位,随便加一点,String是不可变,如果想改变一个字符串可以用StringBuffer或者StringBuild里面的append方法。且StringBuffer是线程安全的,在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。
回复 使用道具 举报
二楼解释的很好
回复 使用道具 举报
解释得都很好 学习啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马