还是老掉牙的问题 String s = new String("abc");
为什么创建的是两个对象呢
我看有人说是  两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
引用也是对象吗?这句话创建是这样的吗
1) 栈中开辟一块空间存放引用s, 
2) 堆中开辟一块空间存放一个新建的String对象"abc", 
3) 引用s指向堆中的新建的String对象"abc", 那个引用算对象吗,算的话那任何一个new出来的岂不都是两个对象了如果两次用String s1 = new String("s1");
          String s2 = new String("s2");
那么第二个语句也是两个对象吗?我后天去用友在北航的宣讲会,各位前辈有什么能指点一下的吗?谢谢

解决方案 »

  1.   

    我估计一个对象一个引用这些人全是背出来的,根本没理解原理。这种问题要分情况讨论。String s = new String("abc");如果String池里没有"abc". 那么
    1. jvm会在String池里开辟一个String对象存放"abc"。跟String s = "abc" 道理一样。
    2. String池中创造好"abc"之后就执行new 操作,在堆内存中开辟一个空间存放new出来的String对象。其实上你new出来的String对象里维护的char数组是指向String池里的"abc"对象里的char数组。 这种情况下你创建的是两个对象。如果String池里已经有"abc"了。
    什么都不说了,直接上面的第二步。
      

  2.   

    String s = new String("abc");
    如果只有这一句,的确是两个对象。
    一个是常量池中的"abc" , 一个是堆内存中的"abc".强调一点:引用不是对象!
    具体这类问题,网上资料比较多。
    我是来拿分的,嘻嘻...
      

  3.   

    可以看看这个!祝楼主好运!
    http://topic.csdn.net/u/20120607/07/9D3A5948-CA38-4EB9-A4F8-63400B34E13A.html
      

  4.   

    我看有人说是 两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。应该是一个是“abc”,一个是指向“abc”的引用对象s。
      

  5.   

    就算是常量池中有 "abc" 也是创建两个对象。
    ===================================================
    笔试回答根本用不到那么麻烦, 你就回答 2个,  1,s | 2, "abc",
    答得越多面试官问的问题越恶心,把重心答上就够了。
    面试过程,他也不会问你这个。 
    想要研究,还是多多找资料吧。
      

  6.   

    的确是两个对象  一个是data区的"abc"字符串   一个是堆内存里的对象
      

  7.   

    当你第一次String s1 = new String("s1");  系统为跟你分析查找在栈的String池里面有没有“s1” 这个对象,如果没有,就会创建一个, 然后再在内存堆里面创建一个String(“s1”)对象。栈里面有个指向这个对象的地址。 
    当你再String s2 = new String("s1") 时,String池里面不会再创建一个新的对象 而是使用第一次在String池里面的那个“s1” 当然还有在堆内存里面个new String("s1") 对象
      

  8.   

    字符串abc创建了一个常量池里的对象。
    new String("abc")创建了另一个对象。
    一共是2个对象
      

  9.   

    的确是两个对象 一个是data区的"abc"字符串 一个是堆内存里的对象