经典的堆指向栈,你new出来的对象是放在堆中的,但是你所指向的值是在栈中啊,“abc”就是作为常量存在栈中的,不管你new多少对象,都会指向这里。

解决方案 »

  1.   

    那个new 出来的对象肯定是在堆中了,"abc"是存储在字符串常量池中;
    s1和s2 都是指向 "adc”对应的内存地址,也就是指向同一个地址值,==比较的就是两个地址是否相等;
    你可以画个图更直观些!
      

  2.   

    在java中有个地方叫“变量池”,像定义 s1和s2的时候,java会在“变量池”中寻找是否有已经定义过的,
    如果有就将引用指向它,这样,当我们使用“==”比较时由于它们是同一个对 象所以输出的是ture。String s1 = new String("abc");  
    String s2 = new String("abc");
    比较的结果就是false
      

  3.   

    如果不好理解,你反过来这么理解:
    假如Test  类有如下的属性:
    Test  a = new Test ();
    Test  b = a;
    你怎么理解a和b呢?
      

  4.   

    首先你要了解 == , ==比较的是地址
    那么你将s1 赋值为abc 就代表在内存中开辟了一个abc的空间
    你将s2也赋值为abc 如果此时内存中没有abc的空间,就会新建一个如果有就同样会指向已创建的abc
    那现在就很明白了 ==比较的是地址,而你的s1 和 s2 又指向同一个 地址,所以true是必然的