黑马程序员技术交流社区

标题: String 问题 [打印本页]

作者: 马如龙    时间: 2014-6-16 21:47
标题: String 问题
String a = "abc"; 和
String  b = new String("abc");

有什么区别

System.out.println(a==b);
结果为  false
为什么不一样



作者: 人心如水    时间: 2014-6-16 22:40
这题是考的String类那一块,老师刚讲过,
String a = "abc"; 这是一个建立了一个“abc”对象,直接把地址值给a
String  b = new String("abc");这里建立了两个对象,一个是new String对象,一个是“abc”对象,b只是指向new String对象
     比较a==b是比较的地址值,肯定不同的
作者: 人心如水    时间: 2014-6-16 22:45
接我上面说的,如果代码改成System.out.println(b.equals(a));就肯定是返回true 应为是比较的对象的值。
作者: ゞ导火索゛    时间: 2014-6-16 22:56
a==b比较的是两个对象的地址,因为a指向的字符串缓冲区中的字符串地址,而b指向的是堆内存中的new出来的字符串对象
作者: 轩辕冰晨    时间: 2014-6-16 23:29
String a = "abc";  只有一个对象 "abc"
String  b = new String("abc"); 有两个对象 new String() 和 "abc"

System.out.println(a==b);
==是比较两个对象地址引用,a指向的地址和b指向的地址不是同一个,new String("abc");是在对内存中新开辟的空间

结果为  false
为什么不一样
作者: 江夷    时间: 2014-6-16 23:44

String a = "abc";  只创建一个对象
String  b = new String("abc");创建了 new String()和“abc”两个对象
a==b 比较的是两个对象的地址值

同时跟这个比较类似的题目还有
String a = "hello";
String b = "world";
String c = "helloworild";
System.out.println(c==a+b);  这个结果同样是false

但如果是:
String a = "hello";
String b = "world";
System.out.println("helloworild"==a+b);  
这个结果楼主可以输出下,应该就可以理解了

作者: 北极£莜蓝    时间: 2014-6-16 23:51
本帖最后由 北极£莜蓝 于 2014-6-17 00:09 编辑

String  a = "abc" ,直接在常量池中构建 "abc"对象,将该对象的值赋值给a,,String  b = new String("abc");需要在创建对象,在堆内存中开辟空间,,       开辟完空间之后,需要在常量池中构建"abc"对象,将该对象的地址值存储到堆内存的空间中,然后将堆内存中的地址值赋值给b,.相当于创建了两个对象,一个在堆中,一个在常量池中.
作者: 北极£莜蓝    时间: 2014-6-16 23:52
= = 比较的是引用数据类型时,比较的是他们的地址值,
作者: 北极£莜蓝    时间: 2014-6-17 00:00
他们的地址不同就是FALSE
作者: 马如龙    时间: 2014-6-17 01:22
北极£莜蓝 发表于 2014-6-17 00:00
他们的地址不同就是FALSE

原来是地址值 谢谢




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