黑马程序员技术交流社区

标题: 关于String用法 [打印本页]

作者: RichardM    时间: 2015-7-5 14:39
标题: 关于String用法
下面关于字符串的题(模样长得差不多),结果不同是为什么:
                String s1 = "a";
                String s2 = "b";
                String s3 = "ab";
                System.out.println(s3 == s1 + s2); // false
                System.out.println(s3 == "a" + "b"); // true
作者: 惜爱上缘    时间: 2015-7-5 15:52
s3 == s1 + s2;
s1 + s2 是两个实例相结合
s3 == s1 + s2;比较的是两个实例他们的地址值是不相等的

作者: qq4916097    时间: 2015-7-5 16:10
对字符串比较来说,首先要区别==和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


作者: 牵着蜗牛去逛街    时间: 2015-7-5 16:21
一楼总结的很到位,随便加一点,String是不可变,如果想改变一个字符串可以用StringBuffer或者StringBuild里面的append方法。且StringBuffer是线程安全的,在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。
作者: 贾森    时间: 2015-7-5 18:28
二楼解释的很好
作者: sophitia    时间: 2015-7-5 18:45
解释得都很好 学习啦




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