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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马如龙 中级黑马   /  2014-6-16 21:47  /  1553 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String a = "abc"; 和
String  b = new String("abc");

有什么区别

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


评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

9 个回复

正序浏览
北极£莜蓝 发表于 2014-6-17 00:00
他们的地址不同就是FALSE

原来是地址值 谢谢
回复 使用道具 举报
他们的地址不同就是FALSE
回复 使用道具 举报
= = 比较的是引用数据类型时,比较的是他们的地址值,
回复 使用道具 举报
本帖最后由 北极£莜蓝 于 2014-6-17 00:09 编辑

String  a = "abc" ,直接在常量池中构建 "abc"对象,将该对象的值赋值给a,,String  b = new String("abc");需要在创建对象,在堆内存中开辟空间,,       开辟完空间之后,需要在常量池中构建"abc"对象,将该对象的地址值存储到堆内存的空间中,然后将堆内存中的地址值赋值给b,.相当于创建了两个对象,一个在堆中,一个在常量池中.

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报

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);  
这个结果楼主可以输出下,应该就可以理解了

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
String a = "abc";  只有一个对象 "abc"
String  b = new String("abc"); 有两个对象 new String() 和 "abc"

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

结果为  false
为什么不一样
回复 使用道具 举报
a==b比较的是两个对象的地址,因为a指向的字符串缓冲区中的字符串地址,而b指向的是堆内存中的new出来的字符串对象
回复 使用道具 举报
接我上面说的,如果代码改成System.out.println(b.equals(a));就肯定是返回true 应为是比较的对象的值。
回复 使用道具 举报
这题是考的String类那一块,老师刚讲过,
String a = "abc"; 这是一个建立了一个“abc”对象,直接把地址值给a
String  b = new String("abc");这里建立了两个对象,一个是new String对象,一个是“abc”对象,b只是指向new String对象
     比较a==b是比较的地址值,肯定不同的

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马