黑马程序员技术交流社区

标题: “==”运算符对引用对象的比较 [打印本页]

作者: 张雄    时间: 2016-4-9 20:22
标题: “==”运算符对引用对象的比较
最近看到一下代码:
String s1 = "Hello";
String s2 = "World";
String s3 = "HelloWorld";
System.out.println(s3 == s1+s2);

控制台输出false;
不太明白,请大神指教。
作者: Java-无招    时间: 2016-4-9 21:21
String s1 = "a";   
String s2 = "b";
String str6 = s1 + s2;      
System.out.println(str6 == "ab");
步骤:  
1) 栈中开辟一块中间存放引用s1,s1指向池中String常量"a",
2) 栈中开辟一块中间存放引用s2,s2指向池中String常量"b",  
3) 栈中开辟一块中间存放引用str5,  
4) s1 + s2通过StringBuilder的最后一步toString()方法还原一个新的String对象"ab",因此堆中开辟一块空间存放此对象,  
5) 引用str6指向堆中(s1 + s2)所还原的新String对象,  
6) str6指向的对象在堆中,而常量"ab"在池中,输出为false

不知道这样讲 ,你是否能看懂。。希望对你有帮助吧!
作者: 张雄    时间: 2016-4-10 12:58
Java-无招 发表于 2016-4-9 21:21
String s1 = "a";   
String s2 = "b";
String str6 = s1 + s2;      

原来是StringBuilder。
作者: grandsun    时间: 2016-4-10 14:10
==号是比较地址值的,
比较内容的是equals.如果改成s3.equals(s1+s2);就会输出true了
作者: 哦哈哟    时间: 2016-4-10 16:12
赞一个额,各位大神,看完你们的我get到了不少之前一直模糊的知识!。
作者: Java-无招    时间: 2016-4-10 18:58
张雄 发表于 2016-4-10 12:58
原来是StringBuilder。

6666666
作者: 董改名    时间: 2016-4-10 19:23
== 比较的是内存地址,equals比较的是对象属性值
作者: clvslyf    时间: 2016-4-10 23:20
==比较的是地址值
作者: 张雄    时间: 2016-4-14 16:10
clvslyf 发表于 2016-4-10 23:20
==比较的是地址值

嗯,我知道这个是比较地址,那么s3==s1+s2;语句中的s1+s2加完了是一个地址值吗?




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