黑马程序员技术交流社区
标题:
关于字符串对象是否相等的一些问题
[打印本页]
作者:
笑轻轻
时间:
2014-8-14 10:11
标题:
关于字符串对象是否相等的一些问题
public class Test {
public static void main(String[] args) {
String a="abcd";
String b="ab";
String c="cd";
String d="ab"+"cd";
String d2=b+c;
A: System.out.println(a==d);//输出true
B: System.out.println(a==d2);//输出false
}
}
//为什么A,B两处输出的不一样,哪位可以解释一下吗?谢谢
作者:
THE_FUTURE
时间:
2014-8-14 10:31
指向的对象不一样。
作者:
依然超级赛亚人
时间:
2014-8-14 11:01
本帖最后由 依然超级赛亚人 于 2014-8-14 11:03 编辑
常量池的概念你应该知道,我就直接忽略这一块,然后在你的代码上通过注释的方式说你的问题:
//首先,这道题中==是用来比较地址值的。
public class Test {
public static void main(String[] args) {
String a="abcd";//执行这步时,字符a,b,c,d先进常量池,然后在堆中开辟一个空间,把字符串"abcd"存进去,地址值复制给变量a。
String b="ab";//执行这一步时,系统在常量池中找到字符a,b然后也开辟一个空间把地址值复制给变量b.
String c="cd";//执行这一步和上一步相同。
String d="ab"+"cd";//执行这一步时先在右边进行字符串的连接,得到"abcd",然后它发现内存中已经有这个字符串(a指向的),所以不再开辟新空间,直接把a指向的地址赋给d一份,那么a和d都指向同一地址,你的第一个输出语句结果就为true了。
String d2=b+c;//执行这一步时,因为是变量直接相加,所以跟上面不一样,系统又给b+c开辟新的空间,然后存进字符串"abcd",把新地址复制给d2,这样下来d2的地址值就和a以及b不一样了,第二个输出结果就为false。
A: System.out.println(a==d);//输出true
B: System.out.println(a==d2);//输出false
}
}
复制代码
我的理解上是面这样的,不知其他人有什么看法,楼主多参照比较一下。如有错误希望批评指正,一块学习。
作者:
happylog
时间:
2014-8-14 11:07
当出现字符串常量的时候,内存会将字符串常量放入常量池中,如果又有一个字符串对象的值与其相同,则这两个引用是指向同一个对象(常量)的,也就是说a==d 都指向abcd这个字符串常量对象
但是d2引用指向的是则不是你可以这样想 d2-》(b->“ab”,c->“cd”)
作者:
笑轻轻
时间:
2014-8-14 14:26
依然超级赛亚人 发表于 2014-8-14 11:01
常量池的概念你应该知道,我就直接忽略这一块,然后在你的代码上通过注释的方式说你的问题:
我的理解上是 ...
回答的真用心,表示感谢
作者:
笑轻轻
时间:
2014-8-14 14:44
这题我是从疯狂java中看到的 因为一时感觉不是很理解所以贴出了问问哪位有更好的理解。在疯狂java中的解释是:
形如String a="abcd";
String b="ab";
String c="cd";
String d="ab"+"cd";这样的创建方式都可以在编译时就确定下来,可以直接引用常量池中的。而 String d2=b+c;不能再编译时确定下来不能引用常量池中的字符串。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2