String s="a"+"b"+"c"产生了几个对象? 这个创建了几个对象。。希望能给的详细点。我认为是三个,可有个哥们说5个,我迷糊了。。请高手指点下。我记牢它

解决方案 »

  1.   

    a
    b
    a+b
    c
    a+b+c
    s
    我怎么算到6个,期待高手
      

  2.   

    一会就有了吧。我刚发了。。
    我现在怎么感觉就产生了一个对象,String s 是在栈中,那最后它指向的是abc,那以前产生的a,ab啥的不都被回收了。
      

  3.   

     以下code生成几个String对象 
        String   a= "abc "; 
        String   b= "abc "; 
        String   c=new   String( "abc "); 
        String   d=c.intern(); 
    String   s   =   new   String( "abc ");创建了几个String   Object? 
    引用变量与对象的区别;   
    字符串文字 "abc "是一个String对象;   
    文字池(pool   of   literal   strings)和堆(heap)中的字符串对象。         一、引用变量与对象:除了一些早期的Java书籍和现在的垃圾书籍,人们都可以从中比较清楚地学习到两者的区别。 
                    A   aa; 
                    这个语句声明一个类A的引用变量aa[我们常常称之为句柄],而对象一般通过new创建。所以题目中s仅仅是一个引用变量,它不是对象。         二、Java中所有的字符串文字[字符串常量]都是一个String的对象。有人[特别是C程序员]在一些场合喜欢把字符串 "当作/看成 "字符数组, 
                    这也没有办法,因为字符串与字符数组存在一些内在的联系。事实上,它与字符数组是两种完全不同的对象。                 System.out.println( "Hello ".length()); 
                    char[]   cc={ 'H ', 'i '}; 
                    System.out.println(cc.length);         三、字符串对象的创建: 
                    由于字符串对象的大量使用(它是一个对象,一般而言对象总是在heap分配内存),Java中为了节省内存空间和运行时间 
                    (如比较字符串时,==比equals()快),在编译阶段就把所有的字符串文字放到一个文字池(pool   of   literal   strings0中, 
                    而运行时文字池成为常量池的一部分。文字池的好处,就是该池中所有相同的字符串常量被合并,只占用一个空间。 
                    我们知道,对两个引用变量,使用==判断它们的值(引用)是否相等,即指向同一个对象:     String   s1   =   "abc "   ; 
        String   s2   =   "abc "   ; 
        if(   s1   ==   s2   )   System.out.println( "s1,s2   refer   to   the   same   object "); 
        else       System.out.println( "trouble "); 
                            这里的输出显示,两个字符串文字保存为一个对象。就是说,上面的代码只在pool中创建了一个String对象。         现在看String   s   =   new   String( "abc ");语句,这里 "abc "本身就是pool中的一个对象,而在运行时执行new   String()时, 
            将pool中的对象复制一份放到heap中,并且把heap中的这个对象的引用交给s持有。ok,这条语句就创建了2个String对象。 
            String   s1   =   new   String( "abc ")   ; 
            String   s2   =   new   String( "abc ")   ; 
            if(   s1   ==   s2   ){   //不会执行的语句} 
                    这时用==判断就可知,虽然两个对象的 "内容 "相同(equals()判断),但两个引用变量所持有的引用不同.intern 
    public   String   intern()返回字符串对象的规范化表示形式。   
    一个初始时为空的字符串池,它由类   String   私有地维护。   当调用   intern   方法时,如果池已经包含一个等于此   String   对象的字符串(该对象由   equals(Object)   方法确定),则返回池中的字符串。否则,将此   String   对象添加到池中,并且返回此   String   对象的引用。   它遵循对于任何两个字符串   s   和   t,当且仅当   s.equals(t)   为   true   时,s.intern()   ==   t.intern()   才为   true。   所有字面值字符串和字符串赋值常量表达式都是内部的。字符串字面值在《Java   Language   Specification》的   §3.10.5   中已定义。   
    返回: 
    一个字符串,内容与此字符串相同,但它保证来自字符串池中。
      

  4.   

    那个s只是指向a+b+c的一个引用,并不是对像.
      

  5.   

    是创建5个对象
    a
    b
    c
    a+b
    a+b+c
      

  6.   

    我怎么觉得是6个。
    a
    b
    c
    ab
    abc
    s
      

  7.   

    不过如果编译器优化的话, 其实就是String s = "abc";
    实际中可能只有s和abc
      

  8.   

    应该是四个吧.
    JAVA中的+是个引用连接,怎么会产生"ab"或"abc"呢?
    应该就是对象a,b,c和一个引用对象s
      

  9.   

    String s="a"+"b"+"c"只产生了一个对象,即 abc,因为在编译时字符串常量会被优化成 abc,如果是变量除外。
      

  10.   

      感觉是5个对象 即 a、b、c、a+b a+b+c