黑马程序员技术交流社区

标题: 关于字符串对象是否相等的一些问题 [打印本页]

作者: 笑轻轻    时间: 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 编辑

常量池的概念你应该知道,我就直接忽略这一块,然后在你的代码上通过注释的方式说你的问题:
  1. //首先,这道题中==是用来比较地址值的。
  2. public class Test {

  3.         public static void main(String[] args) {
  4.         String a="abcd";//执行这步时,字符a,b,c,d先进常量池,然后在堆中开辟一个空间,把字符串"abcd"存进去,地址值复制给变量a。
  5.         String b="ab";//执行这一步时,系统在常量池中找到字符a,b然后也开辟一个空间把地址值复制给变量b.
  6.         String c="cd";//执行这一步和上一步相同。
  7.         String d="ab"+"cd";//执行这一步时先在右边进行字符串的连接,得到"abcd",然后它发现内存中已经有这个字符串(a指向的),所以不再开辟新空间,直接把a指向的地址赋给d一份,那么a和d都指向同一地址,你的第一个输出语句结果就为true了。
  8.         String d2=b+c;//执行这一步时,因为是变量直接相加,所以跟上面不一样,系统又给b+c开辟新的空间,然后存进字符串"abcd",把新地址复制给d2,这样下来d2的地址值就和a以及b不一样了,第二个输出结果就为false。
  9. A:        System.out.println(a==d);//输出true
  10. B:        System.out.println(a==d2);//输出false
  11.         }

  12. }
复制代码

我的理解上是面这样的,不知其他人有什么看法,楼主多参照比较一下。如有错误希望批评指正,一块学习。
作者: 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