String s=new String("ab")+"c";这条语句总共建了几个对象,在堆和池中的结构是什么样的?

解决方案 »

  1.   

    必须的啊~因为学习java的人生生不息啊~^^
      

  2.   

    这个问题要先分析下!
    String s=new String("ab")+"c";
    首先在编译期创建一个常量对象C ,存放在常量池中;再创建一个常量对象ab,存放在常量池中,再创建一个String类型的引用,存放在栈中(引用不是对象)
    然后运行期动态的把常量对象ab传递给String类的构造器,创建一个String类型的对象;
    接着就是把两个对象进行相加
    相加过程中,由于String是不可变的,所以要创建一个StringBuffer对象,然后把String类型的对象装入StringBuffer中 然后用append(c);就像是下面的例子:
     String k=new String("ab");
     StringBuffer m=new StringBuffer(k);
     m.append("c");
     String s=m.toString();
    就这样生成了S;
    综上所述:创建的对象有:常量对象ab; 常量对象c;String类型的对象(即用构造器实例化的那个对象);
              StringBuffer对象  共4个对象
    这也就体现了String的缺点,对字符串相加相率极低  尽量用StringBuffer;
      

  3.   

    堆中:"abc"
    池中:"ab" "c"
      

  4.   

    堆中:"abc" "ab"
    池中:"ab" "c"
      

  5.   

    这么说应该4个String对象加1个StringBuffer对象,共5个
    4个String对象是常量池中3个:ab,b,abc,堆对象ab
      

  6.   

    池中不会有"abc"
    "ab"+"c"这样子写 "abc"才会被建在池中,除此以外,都是在堆中。
      

  7.   

    3个对象string "ab"
    string "c"
    string "abc"
      

  8.   

    我分析一下:
    [color=#0000FF]new String("ab")
    这个语句产生了两个对象,即 池中"ab" 堆中"ab"
    "c"产生了一个对象,即 池中:"c"
    再将他们相加,会产生一个对象:即 堆中:"abc"[/color]
      

  9.   

    原来还是用 StringBuffer 实现的。