一个java面试题:String s = new String("xyz");创建了几个String Object?请高手指点一二 ......谢谢!

解决方案 »

  1.   

    1个类型变量 + 1个String Object
      

  2.   


    new的时候一个,还有一个s
      

  3.   

    ……仔细想了一下,中套了应该是1个类型变量s,作为一个引用2个String Object, xyz编译的时候就存在于常量池,另一个new的时候产生
      

  4.   

    1个类型变量 + 1个String Object
      

  5.   

    两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s
      

  6.   

    da11393(String[] args)的第二次回答是对的。
    第一个对象是字符串常量"xyz"
    第二个对象是new String("xyz")的时候产生的,在heap中分配内存给这个对象,只不过这个对象的内容是指向字符串常量"xyz"
    另外还有一个引用s,指向第二个对象。这是一个变量,在栈中分配内存。
      

  7.   

    两个!
        "xyz"作为一个常量字符串首先被创建,它被保存在“串池”中。所谓串池,简单讲就是从程序运行开始,你创建的所有常量字符串被统一保存的地方。在串池中已经存在"xyz"这个串的情况下,如果你需要一个内容相同的串,你不需要再次创建一个,而是直接用这个就可以,这样当然是为了节省空间。注意,一个字符串是无法被修改的,所以在程序的不同地方用不同变量引用同一个常量串没有任何危险,因为你只能读取它而不能修改它。
        当然,使用new String也创建了一个对象,"xyz"作为传入构造方法的实际参数,其含义就是:我要创建一个串,它的内容和串池中的"xyz"内容一致!
      

  8.   

    准确的说法,应该是:类载入并初始化的时候,产生一个"xyz"的字符串对象存于常量池中
    代码运行到这一行的时候,又产生了一个字符串,存于堆中,是常量池中"xyz"字符串的拷贝
      

  9.   

    如果字符串常量"xyz"已经存在,难道字符串常量池中还会再创建字符串"xyz"吗?
    是不会的!编译器会自动优化处理。
    所以如果字符串常量"xyz"已经存在,只有new的时候才会创建一个对象
    否则,才是两个对象!!
      

  10.   

    两个,一个是"xyz",还有一个是new 出来的string object
      

  11.   

    创建了一个变量s(不是对象),它引用对象new String("xyz").其中"xyz"本身也是一个对象,因为编译器为它遇到的每个字符串直接值自动创建一个String对象,例如int len = "Hello World".length(),所以说总共创建了两个String Object.
      

  12.   

    2个对象。分别为:s , xyz
    3个内在块。s一块,xyz一块,xyz存在字符池也有一块!
      

  13.   

    创建了一个变量s(不是对象),它引用对象new String("xyz").其中"xyz"本身也是一个对象,因为编译器为它遇到的每个字符串直接值自动创建一个String对象,例如int len = "Hello World".length(),所以说总共创建了两个String Object.
      

  14.   

    两个一个在heap中,一个在String常量池
      

  15.   

    两个,一个“xyz”,一个是指向“xyz”的引用。
      

  16.   

    String s = new String("xyz");创建了几个String Object?
    申明了一个对象a,并给他一个值为"xyz"
      

  17.   

    把mocoffee的回答好好看看,讲的太好了
    顶他
    String s = new String("xyz");语句相当于
     String s1="xyz";
     String s=new String(s1);
    结合mocoffee的讲解应该没问题了
      

  18.   

    很老的题目了,
    zzmsl(周先生) ( ) 
    创建了一个变量s(不是对象),它引用对象new String("xyz").其中"xyz"本身也是一个对象,因为编译器为它遇到的每个字符串直接值自动创建一个String对象,例如int len = "Hello World".length(),所以说总共创建了两个String Object.
    这个是正解。做过C++的话就不会有这个疑惑了
      

  19.   

    为什么不象其他的样,在栈上创建个变量S,然后在堆创建个对象"xyz",然后S指向这个对象,这样不是很简单吗?非要搞得那么复杂作什么呢,想不通为什么字符串要这样做.
      

  20.   

    两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
     一家之见
      

  21.   

    应该是3个
    2个对象。分别为:s , xyz
    3个内在块。s一块,xyz一块,xyz存在字符池也有一块!
      

  22.   

    其实在ECLIPSE 里面可以用DEBUG去看看
      

  23.   

    两个对象,一个是“xyx”,一个是指向“xyx”的引用对象。
      

  24.   

    创建了一个String Object,一个引用
      

  25.   

    看看thinking in java
    是一个string object
    s是引用
      

  26.   

    很简单,用System.out.println(s=="xyz")测试一下就知道是不是同一个对象了!!!实际上是:s!="xyz",也就是说,不是一个对象,在这个过程中至少是创建了两个对象:
    首先:创建一个"xyz"的String对象
    然后,以这个对象为参数,创建另一个String对象!!!这句话相当于:
    String a="xyz";
    String s=new String(a);
      

  27.   

    3个撒一个是"xyz"本身,
    第二个是通过new创建出来的String 类型的对象。
    第三个是s,它是第二个对象的引用,也是String类型。
      

  28.   

    两个 《thinking in java》第一章说得最详细
    出题的人可能就那本书看来的
      

  29.   

    这种问题和实际开发根本挂不上,还不如这样问,一般new String()是什么情况下使用?一般是字符集转换.比如new String(s,"GBK","ISO-8859-1")
      

  30.   

    说s的都是错的,看看 Effective Java 就知道了。
      

  31.   

    这是问得最多的问题吧,估计也是考得很多的一个问题.呵呵!lz可以看看这个贴,
    http://community.csdn.net/Expert/topic/5283/5283590.xml?temp=.7259638
    精华贴.!
      

  32.   

    是两个String Object 先声明一下s不是对象只不过是一个引用
    在“xyz”的时候创建了一个String Object
    在new String(“xyz”)的时候又创建了一个String Object
    想一想我们经常这样写 String str=“xyz”;str是一个引用,而“xyz”这样的语法就能创建一个String对象,会在内存中开辟一块空间来存放“xyz”String str1=new String(“xyz”)是根据“xyz”创建一个String对象(注意是从新开辟一块内存,内存中存放的同样是“xyz”)并且让引用str1指向这新的内存综上所述在你的程序中创建了两个String Object 和一个引用
      

  33.   

    中计了, s = "xyz" 和 s = new String("xyz") 就不是一回事
      

  34.   

    我赞成66楼的说法:
    但如果是这样的话:
    是不是在堆中就会有两个“xyz”呀……?
      

  35.   

    15楼回答不错,
    有可能创建一个,有可能创建两个。
    如果JAVA字符串池中存在xyz就不会再创建一个,JAVA会自动取常量池中的字符串。
    但new的时候会创建一个。
    所以大家要明白一个问题
    class A
    {
        public String s = "xyz";
    }class B
    {
        public String y = "xyz";
    }那么A中的s 能不能用 == B中的y呢?
    答案是true.OK。
      

  36.   

    两个! 
            "xyz "作为一个常量字符串首先被创建,它被保存在“串池”中。所谓串池,简单讲就是从程序运行开始,你创建的所有常量字符串被统一保存的地方。在串池中已经存在 "xyz "这个串的情况下,如果你需要一个内容相同的串,你不需要再次创建一个,而是直接用这个就可以,这样当然是为了节省空间。注意,一个字符串是无法被修改的,所以在程序的不同地方用不同变量引用同一个常量串没有任何危险,因为你只能读取它而不能修改它。 
        当然,使用new   String也创建了一个对象, "xyz "作为传入构造方法的实际参数,其含义就是:我要创建一个串,它的内容和串池中的 "xyz "内容一致!
      

  37.   

    两个,一个是s,另一个是new出来的string object。