黑马程序员技术交流社区

标题: 这个结果为什么是false啊 [打印本页]

作者: wayonEmes    时间: 2015-7-28 10:42
标题: 这个结果为什么是false啊
本帖最后由 wayonEmes 于 2015-8-13 23:35 编辑

String s1 = "Hello";
String s2 ="World";
String s3 ="HelloWorld";
System.out.println(s3==s1+s2);


作者: halohoop    时间: 2015-7-28 10:49
如果你能回答
System.out.println(s3.equals(s1+s2));
为什么是true的话你就知道了!

作者: wayonEmes    时间: 2015-7-28 10:54
halohoop 发表于 2015-7-28 10:49
如果你能回答
System.out.println(s3.equals(s1+s2));
为什么是true的话你就知道了!

这个我知道啊,是String类重写了Object中的equals方法,比较的是字符串的值
==好像是比较的地址值,可是为什么String s1 ="hello";String s2="hello";
输出s1==s2的结果是true而这个的结果是false呢
作者: 122125241    时间: 2015-7-28 11:05
s3==s1+s2
s3== "Hello"+"World"
这俩你知道了么,你可以试试   还有反编译看下  自己看出来的才是最理解的
作者: wayonEmes    时间: 2015-7-28 11:09
122125241 发表于 2015-7-28 11:05
s3==s1+s2
s3== "Hello"+"World"
这俩你知道了么,你可以试试   还有反编译看下  自己看出来的才是最理解的 ...

好的 ,谢谢啦
作者: BugKing    时间: 2015-7-28 11:10
[quote]wayonEmes 发表于 2015-7-28 10:42
String s1 =

看过,水一个
作者: boboyuwu    时间: 2015-7-28 17:13
这个问题看似简单还真有些深度
作者: zk338142    时间: 2015-7-28 17:48
看着好难,努力学习中
作者: a12366456    时间: 2015-7-28 18:00
==比较的是对象的地址,只要知道==右边是否是一个新的不同于s3的对象就行了,s1+s2是两个变量相+,这是编译期无法确定,只有在运行期才能确定,所以这个生成了新的对象。如果换成两个常量相+,编译期就能确定,指向常量池的一个对象引用,所以System.out.println(s3 == "Hello" + "World");//结果一定是true。另外还有new一定生成新对象。
作者: 陈思伟    时间: 2015-7-28 21:16
貌似是地址值的比较。。。
作者: chad8753    时间: 2015-7-28 21:25
学习了,,,
作者: zhaoyue    时间: 2015-7-28 21:27
我也是今天刚学的。楼主是在传智上课的吗?
老师讲S1+S2时要创建对象,所以地址值不同,用==号比较的时候比较地址值,所以不一样
作者: 3174918418    时间: 2015-7-28 21:30
==是用來比较对象的地址,
結果是s3的地址不等於s1+s2
作者: 陈建民1    时间: 2015-7-28 21:31
不懂,来学知识的。。。
作者: chad8753    时间: 2015-7-28 21:40
学习学习,,,
作者: 致远czy    时间: 2015-7-28 21:42
== 比较的是对象的地址值
作者: qiyongjian    时间: 2015-7-28 22:12
加油,想想未来的美好生活,你就有动力了
作者: e咕噜    时间: 2015-7-28 22:23
s是引用型变量,==比较的就是实际地址啊
作者: 逆光奔跑    时间: 2015-7-28 23:06
字符是连接吧,怎么比较?
作者: wayonEmes    时间: 2015-7-29 20:57
zhaoyue 发表于 2015-7-28 21:27
我也是今天刚学的。楼主是在传智上课的吗?
老师讲S1+S2时要创建对象,所以地址值不同,用==号比较的时候比 ...

对啊,就是在传智啊,不过我用反编译编译出来右边是一个StringBuilder
作者: zhaoyue    时间: 2015-7-30 21:43
恩 ,今天学了,+号其实就是用String的链接方法,是创建对象的  所以地址值不同,
作者: 曾云鹏    时间: 2015-7-30 22:04
学习了~~~
作者: 菜鸟哥    时间: 2015-7-30 22:28
很诡异啊这个题
作者: tbcnscc3c2    时间: 2015-7-31 12:05
因为==是比较地址
而:
String s1 ="hello";String s2="hello";会输出true,是因为他们指向的是同一个对象;
Java为了效率为String提供了串池,当使用这种方法申明的两个字符串内容相同,将不会开辟新的内存空间而导致内存地址相同;
如果你这样String s1 = new String("hello");输出的就是false,他们指向的不再是一个对象
这种方法不管串池中是否以后“hello”都将再重新开辟一块内存空间因此使用==输出的是false
作者: tbcnscc3c2    时间: 2015-7-31 12:07
第二种方法定义了一个新的对象
作者: zk338142    时间: 2015-7-31 12:08
还没学到,看看怎么回事
作者: 段燚涛    时间: 2015-7-31 15:49
版主你好,请参考下我之前写过的一篇关于对象内存管理模型的文章(http://blog.csdn.net/u010111458/article/details/46928871)。
只要对内存模型有所掌握,这就很容易就理解。
作者: hack小杰    时间: 2015-7-31 15:51
这种只是比价两个对象的地址值吧
作者: keviner    时间: 2015-7-31 15:54
比较的是内存地址
作者: DD_vincent    时间: 2015-7-31 16:31
把栈内存,堆内存还有常量池搞清楚,这个问题就很简单类
作者: 天地一沙鸥    时间: 2015-7-31 22:20
这个涉及到一点常量池的内容,注意,变量相加的时候会自动开辟新空间,常量相加会在常量池中去寻找是否有一样的常量。
所以
String s = "Hello";
String s1 = "World";
String s2 = "HelloWorld";
System.out.println(s2==s+s1);//运行结果为false,因为开辟了新空间。
System.out.println(s2=="Hello"+"World");//运行结果为true,因为相加结果进入了常量池。
作者: 任有智双元    时间: 2015-7-31 22:40
好像我还好不知道..
作者: Apol    时间: 2015-7-31 22:45
wayonEmes 发表于 2015-7-28 10:54
这个我知道啊,是String类重写了Object中的equals方法,比较的是字符串的值
==好像是比较的地址值,可是为什 ...

它们是没有用关键字new创建的对象,上面两个字符串的内容相同,在内存中只开辟一块空间,是同一个对象,当用关键字new创建时,就是两个对象了
作者: 水佳伟    时间: 2015-7-31 23:00
楼主高富帅,楼主v587
作者: wode1311    时间: 2015-7-31 23:07
String是一个引用类型,+仅仅是字符串的拼接,而==比较的是引用类型的地址值,结果当然是false了。
作者: wayonEmes    时间: 2015-8-1 00:11
wode1311 发表于 2015-7-31 23:07
String是一个引用类型,+仅仅是字符串的拼接,而==比较的是引用类型的地址值,结果当然是false了。 ...

可是String s1 ="hello";

作者: wayonEmes    时间: 2015-8-1 00:12
wode1311 发表于 2015-7-31 23:07
String是一个引用类型,+仅仅是字符串的拼接,而==比较的是引用类型的地址值,结果当然是false了。 ...

可是String s1 ="hello";
      String s2 ="hello";
syso(s1==s2);
两个都是引用类型,比较地址值,结果应该是false啊
可是结果却是true
作者: wayonEmes    时间: 2015-8-1 00:15
Apol 发表于 2015-7-31 22:45
它们是没有用关键字new创建的对象,上面两个字符串的内容相同,在内存中只开辟一块空间,是同一个对象, ...

嗯嗯 开始还是没有明白字符串的拼接机制是利用缓冲区完成的
作者: wayonEmes    时间: 2015-8-1 00:18
天地一沙鸥 发表于 2015-7-31 22:20
这个涉及到一点常量池的内容,注意,变量相加的时候会自动开辟新空间,常量相加会在常量池中去寻找是否有一 ...

谢谢啦 ,感谢你的帮助
作者: hellojavacode    时间: 2015-8-1 00:19
字符串是不能用==进行比较的。你可以通过s3.equals(s1+s2)来进行比较




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