String s = new String("a");创建了几个String Object?答案:两个.书上看见的.不明白为什么是2个..
不是只new了一个String的实例吗?  
期待高手解答..

解决方案 »

  1.   

    String为不可改变量,s指向了“a”的引用,所以是两个
      

  2.   

    String pool有 "a"对象
    jvm的stack里有指向a引用对象
      

  3.   

    其实把创建一个String分成两步,就更容易理解些,如下:
    String s;
    s = new String("a");以上两步第一步创建了一个对象S(第一个Object),第二步给对象S赋值为“a”(第二个Object)。
      

  4.   

    这样想把
    正常情况是 String s = "a";  它是有一个String对象的
    现在又new了一个String  所以是2个
      

  5.   

    String s;
    这是声明了一个对像,你可以对他赋值s="a";
    这样只有一个对像,
    那你使用了new string("a")那么对像S得到了实实例化,它引用了括号中的a,相当于给它赋值.但是这个a是S的引用,所以它也是一个对像.
      

  6.   

    String s1 = new String("s1") ;
    String s2 = new String("s1") ;
    上面创建了几个String对象?
    答案:3个 ,编译期Constant Pool中创建1个,运行期heap中创建2个.
    string str2 = new String("abc")
    创建了2个对象,编译期Constant Pool中创建1个,运行期heap中创建一个pool中只要有相同值的只创建一次。heap中有相同值的,在heap中都开辟内存空间,后面开辟的是指向第一个开辟的引用(即指针)另外,基本数据类型是存在stack中,对象类型是存在heap中
      

  7.   

    2个.
    可以这么理解.
    一个是"a",在字符串池里.
    另外那个就是你new出来的s.所以是2个
      

  8.   

    无聊stack上面有个指向对象的引用
    堆上面有个对象
      

  9.   


    //使用简单语法创建字符串对象s1
    String s1 = "JavaSE6.0";
    //使用构造器创建字符串对象s2
    String s2 = new String("JavaSE6.0");上面的代码中,使用new创建字符串对象的步骤如下.
    (1)首先在堆(不是在常量池)中创建一个包含指定内容的字符串对象,并将字符串引用指向该对象.例如上述代码中,使用New创建字符串s2,其会直接在堆中创建一个内容为""JavaSE6.0"的字符串对象,并将引用s2指向该对象.
    (2)去字符串常量池中查看,是否有包含该内容的对象.
    (3)若有,则将new出来的字符串对象与字符串常量池中内容相同的对象联系起来.例如,本例中s2所指向的对象与s1所指向的联系起来.
    (4)若没有,则在字符串常量池再创建一个包含该内容的字符串对象,并将堆中的对象与字符串常量池中新创建出来的对象联系起来.楼主理解上面就知道是怎么回事了.
      

  10.   

    前几天朋友问过我这个问题,
    String s=new String("a");
    你至少知道现在使用new创建了一个对象。为什么还有一个呢,其实这是java中对String对象存储的特殊性,因为每个String对象都是不可变的,
    你使用"a"来做参数,在后台jvm就会对它进行创建
      

  11.   

    注意:
         对于String类型,JVM维护两个内存区域,一个是串池,一个是堆
         1.对于String s=“a”,这个“a”就会在串池中开辟一个内存空间用于存放“a”(也就是创建了一个对象)
         2.对于String s1=new String("a"),这种样式的都直接在对中创建对象
         对于第二中情况要注意一点就是,JVM先查看“a”在串池中有没有定义过,如果定义过,串池中就不开辟空间了,就只在内存中创建对象,        反之,如果没有定义过,就先在串池中开辟空间。
         总结:JVM对八大基本类型的包装类型都维护了一个串池,对于String s="a";Integer i=1;Double d=1.0d; ......为什么维护个串池呢?原因很显然,即如果多次遇到串池中有同样的值,就不用开辟新的空间了。这个串池概念还用在哪呢?目前据我所知,在连接数据库的时候,tomcat也维护了一个串池,这样就可以用有限的Connection来负责数据库连接了,就不用浪费资源了。切记一点对于new都一定会在堆中开辟空间。
      

  12.   

    String类有一个构造方法:
        String(String original) 
       它初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
    所以说String s = new String("a"),s是一个字符串对象,而“a”也是一个字符串对象。
        而String s = "a";就只创建了一个字符串对象。
      

  13.   

    明白了.
    就是String类特别.以前都没注意过这问题.
    以前以为Object obj = new Object()
    都是在栈空间里分配一变量obj,然后obj保存的是堆空间里new出来的Object类的实例的一个引用..
      

  14.   


    说的不对。
    这个其实说1个或者2个感觉都不对。
    我的理解是如果pool里面目前没有a这个串, 则先创建"a"的字符串, 然后把这个值赋给那个new string.
    至于s其实只是一个引用, 不是真正对象。这时是创建了2个对象。
    如果pool里面有a, 则直接把a的值给new string.
    这时是创建1个对象。