String s="a"+"b"+"c"+"a";
s=new String(s);
到现在为止,共创建了几对象呢,分别是哪几个?

解决方案 »

  1.   

    6个,不笑得对不对。5个在字符串池,1个是new的
      

  2.   

    6个吧
    tring s="a"+"b"+"c"+"a"; 
    s=new String(s); 
    到现在为止,共创建了几对象呢,分别是哪几个?
    a,b,c,a 分别是一个 s 是一个
    下面的 s 又分配了一个
      

  3.   

    String 不适合做字符串相加
    6个
      

  4.   

    晕 String s = “a”+"b"+"c"+...这个jvm会自动优化的,其效果跟用StringBuilder或StringBuffer一样!!!
      

  5.   

    我也认为是5个 字符串连接会自动调用StringBuilder优化,所以只会产生一个缓冲池的对象
      

  6.   

    "a" , "b" , "c" , "abca"(String pool 中) , "abca"(堆中) 一共5个 
      

  7.   

    总共是8个对象
    "a" , "b" , "c", "a" 4个
    "a"+"b"+"c"+"a" 又创建3个
    new String(s) 再创建一个
    总共8个
    JAVA资料太多?选中想收藏的文字(图片),右键选“收录到易载”,搞定!
      

  8.   

    严重同意13楼!String s="a"+"b"+"c"+"a"; 
    s=new String(s); StringPool 中: "a" , "b" , "c" (再次的“a”不用再创建,要不然要Pool就没意义了), "abca" 
    堆中:  "abca"
      

  9.   


    只有两个,"abca" 和 "abca" 的副本"a" + "b" + "c" + "a" 由于全部属于常量,JVM 在编译时就会优化成为 "abca"
    存放在字符串池中。另 new String(String str) 这个方法,是创建 str 对象的副本(这个方法的
    API DOC 上有明确的说明)因为,abca 已经在常量池中了,如果是采用 String str = s; 的话,直接将常量
    池中 abca 的引用地址复制给了变量 str,str 和 s 的引用是一样的。而
    String str = new String(s); 这时根据 s 的引用值,创建了一个新的对象,而
    这个对象虽说值与 s 的值是一样的,但是它们值的内部地址是不一样的(s 的引
    用位于常量数池中,str 的值只是局部变量中的值,并不是引用常量数池中的值)如果是:String s = "a";
    String str = s + "b";会在常量池中创建两个字符串 "a" 和 "b",后面运算时产生的 "ab" 不会放入常量池中,
    而是存放于局部变量中了。更多关于字符串内部操作的信息可以看看
    http://topic.csdn.net/u/20080415/12/3f2b9589-e97c-4129-8941-011bd9203a98.html
    42 楼的回复。
      

  10.   

    7个吧
    String s="a"+"b"+"c"+"a"; 
    s=new String(s);a,b,c是3个
    ab,abc,abca
    然后你又new了一下new String(s) ;
    应该是7个吧呵呵
      

  11.   

    不是8个...new String(s);只是一个s的引用..不是真实的字符串不能算一个
      

  12.   

    两个对象
    String s="a"+"b"+"c"+"a"; 
    等价于
    String s="abcd";
    也就是只创建了一个 “abcd”
    后面new出一个新的对象
      

  13.   

    5个 "a", "b", "c", "d", new string(s)
    s是对象变量而已