String a = “张三”;
String b =“张”;
String c =“三”;
String d = b+c;
为什么a==d啊,内存中是什么样的

解决方案 »

  1.   

    a==d得到的结果应该是false的,因为在JVM中,a所指向的内存区域和d所指向的内存区域是不同的,但是如果使用的是a.equals(d)得到的结果是true,此时由于String类中的equals方法进行了覆盖,所以只要两个对象内容一致,返回true。但是a==d得到的结果却只有false,不会为true。你可以自己写几行代码尝试着做做,很快就能明白的!
      

  2.   

    没new的话 abc不是应该在常量池吗 那个里面不是唯一的吗  我初学感觉这个把我弄迷糊了
      

  3.   

    String类用==比较的是地址,不是实际值。
    比如你a的地址是2001;
               b的地址是2002;//瞎写的,下同
               c的地址是2003;
    那么你b+c的地址是2004。//因为String类已确定的值不会改变。
    你把地址为4的值引用到d上。那么a==d对比的是地址2001和地址2004,而不是分别的两个值(“张三”和“张三”)。
    这两个地址当然不同,所以为false。要想比较两个String类的值是否相等,就必须用.equals(ogj)方法。
      

  4.   

    就必须用.equals(obj)方法。写错了。
    我没有权限编辑。
      

  5.   

    看来楼主被绕晕了。想要弄清楚这个问题,得先弄清楚以下概念:
    1、常量池: 字符串常量池(String pool, String intern pool, String保留池) 是Java堆内存中一个特殊的存储区域, 当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。
    2、==与equals的区别:==比较的是内存地址
    再来看楼主的问题:
    String d = b+c 为什么不等于a,楼主你看String源码就知道了。b+c,先执行StringBuilder的拼接,相当于new了一下,虽然值相等,但内存地址已变。
    所以d==a肯定为false,我以前也被绕晕过,哈哈,有什么不懂得可以继续问我。
      

  6.   

    http://blog.csdn.net/u010887744/article/details/50844525楼主有兴趣可以看看这篇文章:《Java的string类常量池及不可变性》,希望对你有所帮助。
      

  7.   

    不扯什么常量池的概念,就说内存,内存里有四个对象:
    1,“张三”
    2,“张”
    3,“三”
    4,“张三”
    注意第一个张三和最后一个不是同个对象,就是不在同个内存地址里面,另外==用来比较内存地址。
    所以他们不等于的理由就是:
    1,==比较的是内存地址,所以结果就取决于内存地址是否相同
    2,内存地址不一样的,所以结果false