String s = new String("abc") + new String("abc"); 请问这产生几个对象?

解决方案 »

  1.   

    每new一次,就会在jvm所管理的内存堆中开辟一块儿区间,用以保存所创建的对象的具体内容,
    new 了两次就产生了两个对象。
      

  2.   

    每new一次,就会在jvm所管理的内存堆中开辟一块儿区间,用以保存所创建的对象的具体内容,
    new 了两次就产生了两个对象。
      

  3.   

    3个吧,2个new出来的和一个相加的结果字符串对象
    不知道常量池是否会生成一个"abcabc"对象,如果生成,就有4个
      

  4.   

    对,如果程序执行到这句的时候,上文已经在常量池生成了"abc",那就产生了3个,否则就是4个。
      

  5.   

    两个new 两个  在外加一个合起来的   总共三个吧 
      

  6.   

    会构建5个对象。
    详情请见:http://wlbbswl.javaeye.com/blog/682960
      

  7.   

    产生4个对象,如同楼上的说法http://wlbbswl.javaeye.com/blog/682960
    可能注意的是String的引用变量算不算到里面。。我这里没算
      

  8.   

    至少三个对象。。s 一个对象  两个new 代表两个对象。。至于常量池里面有没有对象我就不是很清楚了!!
      

  9.   


    按照你的说法:
    在String池里生成1个"abc"对象;
    在内存中new了2对象"abc","abc";
    两个对象相加会在String池里再生成1个对象"abcabc";这加一起也就是4个对象! 怎么会是5个呢?
      

  10.   

    4个 
    分解为 String s1=  new String("abc");  创建2个
    String s2=  new String("abc"); +1
    string s=s1+s2; +1
      

  11.   

    String s = new String("abc") + new String("abc"); 请问这产生几个对象?2个new 是2个对象 +一起又是一个对象 S是个对象 是4个吧
      

  12.   

    每new一次,就会在jvm所管理的内存堆中开辟一块儿区间,用以保存所创建的对象的具体内容,
    new 了两次就产生了两个对象。
      

  13.   

    看看 java虚拟机的书吧 写的很详细的
      

  14.   

    String s = new String("abc") + new String("abc");new String("abc") 会产生  2 个 new String("abc")  会产生  2 个 String s   1个一共  5个
      

  15.   

    个人觉得四个,常量池“abc”1个,new了2个,String s 1个
      

  16.   

    3个
    我记得有个经典的问题就是String s = new String("abc"); 这是产生2个对象,那么楼主那个一定是3个。
      

  17.   

    有StringBuffer么??貌似String的相加会调用StringBuffer啊!~~
      

  18.   

    1: "abc"
    2: new String("abc");
    3: new String("abc");
    4: new StringBuffer();
    5: "abcabc"我觉得应该是这样子的!~~
      

  19.   


    解释下第4步,字符串的串联是通过StringBuffer的append方法实现的,然后通过toString方法输出,在字符串缓冲区产生一个"abcabc"我是新人。。欢迎拍砖!~~
      

  20.   

    应该是四个,"abc"是字符串常量池中的数,如果存在的话,只会有一个,创建第一new String("abc")时,搜索字符串常量池中是否存在"abc",不存在则创建,这个工作在编译时完成。创建第二个时候先去找池中存不存在"abc",如果存在就什么也不做。在运行的时候再创建两个new String("abc")放在堆区,然后相加之后又生成一个新的对象,也放在堆区。这样总共四个。
      

  21.   

    我还觉得是4个呢
    第一个 双引号"abc"
    第二个 new String("abc")
    第三个 new String("abc")
    第四个 两个new的String对象合成的"abcabc"
      

  22.   

    好像不是这样的吧,当s1 new出 String("abc")在堆内存里就有了两个,只是地址不同而已。而s2只是在String池能在堆内存中找到"abc",就没必要再生成一个"abc"了。同意43楼的。
      

  23.   

    很显然是三个对象啊。
    首先String s实例化了一个对象,后面依次实例化两个对象。
    在内存中处理的过程是:
    分配两个空间分别用来存放两个“abc”
    然后再分配一块内存来存s,此时的s=“abcabc”的
    这就是JAVA中String类的特征。
    深入内存中才能理解JAVA String类的不可变性质。
    这也是为什么StringBuffer这个类的好用处所在。
      

  24.   

    有可能是3个,有可能是2个,如果"abc"内存已经有了,就创建两上,如果内存中没有,就创建2个对像
      

  25.   

    受不了了,变着花样地问 new String 有多少个对象!
      

  26.   

    4个,abc和两个new产生的还有个一个abcabc
      

  27.   

    5个,String s1 = new String("abc") 2个,String s2 = new String("abc") 2个他们不会入池的,应为是new出来的,最后两个s1 + s2 1个。2+2+1 = 5
      

  28.   

    个人认为是 2 个,两个new算 2 个 ,
    String类比较特殊,创建之后数据会放在常量区,所以String s 的时候相当于只是去引用而已,并未创建新的变量。
      

  29.   

    5个String的abc也是对象!new也是对象 2+2+1   5个
      

  30.   

    如果是字符串对象的话就是4个,一个是"abc",另外两个是new String("abc"),一个是"abcabc"
    其中当第二次使用new String("abc")的中"abc"已经存在,不需要在重新创建
    一共四个字符串对象
    如果还有引用对象的话,还有s
      

  31.   

    个人看马士兵视频的按他说的应该是3个吧...s+2个new在栈空间,abc分配在堆空间不算
      

  32.   

    Sring用new去生成对象是先去看String pool中有没有这个对象,没有则这在pool中生成一个对象,再在堆中生成一个对象,返回堆中对象的地址 ; 有则直接在堆中生成一个对象,返回堆中对象的地址;
    然后new出来的对象相加和new的效果差不多;
    所以,假设你没有生成过对象,你的那个表达式会生成
    池中: abc ,    abcabc     两个
    堆中: abc 两个   abcabc一个
    一共  5个     个人看法!!!!
      

  33.   

         要看按什么角度看,其实这个是要详细得去理解JVM的,将代码反编译就能看出到底是几个了!
      

  34.   

    理论上是4个,两个 "abc" 算一个(参考 String.intern() 方法),+ 两个 new + 最后赋值那个。
    但是,我们因该知道,编译器会很聪明的优化~~~所以具体产生的对象得看具体的编译器的版本。