String str = new String() ;这句话创建几个对象
我只知道String str = new String(“abc”) ;先在字符串池找"abc",如果不存在,就创建一个,然后把它拷贝一个到堆中。但如果想String str = new String() ;这样不带参数的我就不知道它是怎样创建的??创建几个??

解决方案 »

  1.   

    不带参数是正常相当于调用了这个构造方法:
    public String () {
    value = new char[0];
    offset = 0;
    count = 0;
    }
    只创建了String对象带参数相当于调用了这个构造方法:
    public String (String string) {
    value = string.value;
    offset = string.offset;
    count = string.count;
    }
    也就是有两个String对象
      

  2.   

    String str = new String("abc")
    这样得方式创建了两个对象,一个是abc,一个是str,一般不建议这样创建
    直接String str = "abc";就可以
    另外楼主说错了,第一种方式创建的,也就是用new创建的,不会去字符串池中找看是否有相同的,
    new创建的会在堆中重新开辟内存。
    也就是说String str = new String("abc")
           String str2 = new String("abc")这样创建的str 和 str2 其实是两个对象但是 String str = "abc"
    String str2 = "abc"这样创建的str == str2 当你创建str2得时候会在字符串池中找是否有"abc"存在,若存在则不会创建了,直接把str2这个引用指过去
      

  3.   

    因为括号里没有参数,所以就new那一个对象了
      

  4.   

    我感觉5楼的有点问题 
    在创建新的String时 会去看池里有没有一样的串 有的话就不再创建 将对象引用指向那个字符串 没有的话就创建一个
    String str = new String("abc")
    String str2 = new String("abc") str和str2是两个对象引用 他们指向的对象是两个不同的对象 但对象中的值是指向池中的同一个字符串“abc”
    字符串池中始终就只有一个字符串“abc”这是我的理解 请大家指正 呵呵
      

  5.   

    10楼的问题也是我的问题。
    10楼说:在创建新的String时 会去看字符串池里有没有一样的串5楼说:用new创建的字符串,(即String str = new String("abc"))不会去字符串池中找看是否有相同的, new创建的会在堆中重新开辟内存。5楼接着说:但是用这种方法 String str = "abc" 创建时会在字符串池中找是否有"abc"存在,若存在则不会创建了,直接把str这个引用指过去;
     
    到底谁的说法对呢?来测试下。呵呵
            String str = new String ("abc");
    String str2 = new String ("abc");
    if(str==str2) System.out.println("10楼是对的");
    else System.out.println("5楼是对的"); String s1="abc";
    String s2="abc";
    if(s1==s2) System.out.print("5楼是对的");
    else System.out.print("5楼是错的");
    我们知道对象之间“==”是比较其地址的。结果是:
     5楼是对的
    5楼是对的那么通过验证,我知道了两种给字符串变量初始化的方法及它们的区别了。
      

  6.   

    没带参数的创建一个对象, 
    带参数的创建两个对象.
    直接就String str = new String("abc") 写成String str = "abc" ;不就行了嘛
    怎么那么累赘~
      

  7.   

    看看这篇Blog吧,里面有一些代码和经典的帖子,去看看吧:对于String的认识
      

  8.   

    String str = new String("abc") ;
    创建了两个对象
    str和"abd"
    另外用new创建的string对象不会去栈中寻找有没有"abc"这个串。所以一般不使用new创建。
    String str2 = new String() ;
    不懂
    等待正解
      

  9.   

    http://topic.csdn.net/u/20080929/02/4e0ef626-98ee-4d6d-96ed-fe40afe8290b.html
      

  10.   

    String str = new String ("abc"); 
    String str2 = new String ("abc"); 
    if(str==str2) System.out.println("10楼是对的"); 
    else System.out.println("5楼是对的"); String s1="abc"; 
    String s2="abc"; 
    if(s1==s2) System.out.print("5楼是对的"); 
    else System.out.print("5楼是错的"); 上面是13楼的程序
    我要说的是,13楼这么测试是有问题的
    先看这段:
    String str = new String ("abc"); 
    String str2 = new String ("abc"); 
    if(str==str2) System.out.println("10楼是对的"); 
    else System.out.println("5楼是对的"); 
    输出肯定是:"5楼是对的"
    为什么,因为他们是两个不同的对象
    但是10楼有说:
    'str和str2是两个对象引用 他们指向的对象是两个不同的对象 但对象中的值是指向池中的同一个字符串"abc”中'
    这个本来就是正确的,str 和str2 的确是不同的两个对象,但他们的值的确是一样的。所以单凭空上来证明10楼不对是错误的.我们可以试下下面这段代码:
    String str = new String ("abc"); 
    String str2 = new String ("abc"); 
    if((str != str2) )
        System.out.println("10楼是对的");
    else if(str.equals(str2))
        System.out.println("10楼是对的");
    else 
        System.out.println("10楼是错的");来证明10楼是对的
      

  11.   

    新手问
    value = string.value; 
    offset = string.offset; 
    count = string.count; 
    这3个是String类调用的什么方法?查了API的String类 好像没有这些方法啊
      

  12.   

    谢猴子的BLOG,认识了很多问题
      

  13.   

    5楼说:
    另外楼主说错了,第一种方式创建的,也就是用new创建的,不会去字符串池中找看是否有相同的, 
    new创建的会在堆中重新开辟内存。 好像不对,new创建的会在堆中重新开辟内存这没错,new创建的肯定会在堆中开辟内存的,但用new创建的,他在堆中开辟内存前,会先去字符串池中找看是否有相同的,如果有相同的,就拷贝到堆中,如果没有,就先在字符串池中建一个,然后再拷贝到堆中我只想知道的是String str = new String();这样会怎样创建,麻烦大家只跟我说说这样的情况会怎样创建,谢谢
      

  14.   

    呵呵  我问你:
    Object o = new Object();
    //这个创建几个对象?
    //现在的某些个别程序员越学越倒退了String str = new String();这样会怎样创建?
    答:
    String
    public String()初始化一个新创建的 String 对象,使其表示一个空字符序列。注意,由于 String 是不可变的,所以无需使用此构造方法。
    这个方法没有任何用处。 
      

  15.   

    http://blog.csdn.net/czx33859066/archive/2008/09/22/2962722.aspx
    楼主想要的答案都在里面了 
      

  16.   

    http://blog.csdn.net/czx33859066/archive/2008/09/22/2962722.aspx 
      

  17.   

    String str = new String() ;
    String str = new String(“abc”) ;
    都是只创建一个对象。
    即时你连续执行2次
    String str = new String(“abc”) ;
    str = new String(“abc”) ;都不会是返回同一个对象,而是2个不同对象,在你创建第二个对象时,第一个对象如果没有别人引用,就会作为待垃圾回收的对象.
    不过这2个对象是相等的 equals的 ,但是不是同一个对象,是 != 的
    几十元把女朋友打扮成清纯公主

      

  18.   

    上面说错了,不好意思。
    String str = new String(“abc”) ; 是会创建2个对象。
      

  19.   

           String s1=new String("abc");
           String s2=new String("abc");       
           System.out.println(s2.intern()==s1.intern());
           System.out.println(s1.intern()=="abc");
    根据这段代码来看好像10楼对的
      

  20.   

    都只创建一个对象
    注意第0,8行
    下面是用:
    javap -c Test
    反编译的结果
    public class Test
    {
    public static void main(String[] args)
    {
    String str1 = new String();
    String str2 = new String("abc");
    }
    }
    /*
      Code:
       0:   new     #2; //class java/lang/String
       3:   dup
       4:   invokespecial   #3; //Method java/lang/String."<init>":()V
       7:   astore_1
       8:   new     #2; //class java/lang/String
       11:  dup
       12:  ldc     #4; //String abc
       14:  invokespecial   #5; //Method java/lang/String."<init>":(Ljava/lang/String;)V
       17:  astore_2
       18:  return
     */
      

  21.   

    两个对象,一个是String() 对象,  一个是指向String对象的引用str ,很多公司的面试题,都会问到这个。
      

  22.   

    String str = new String();创建一个对象,一般不建议使用来初始化字符串变量,
    直接 String str = null; or String str;就可以了.
    而 String str2 = new String("abc");创建了2个对象.