对于String创建的两种方法,的确是老的不能再老的问题了,下面说说我的看法:
创建方法:
1.String str = new "test";
2.String str_new = new String("test");
说明:
1: 在pool上创建String;如果如果pool中已经存在一个等于此 "test"的字符串,则直接将"test"赋给str_1,那么Str就是该字符串的引用;如果不存在则先在pool中新建一个字符串"test",将引用赋给str_1。
2:在heap中创建String;与pool毫无关系,创建两个对象,一个是实际的存储对象,一个则是引用。测试程序:
public class StringTest {
public static void main(String[] args) {

String str = "test";
String str_ano = "test";
String str_new = new String("test");
String str_new_ano = new String("test").intern();

System.out.println(str == str_ano);        //-------a
System.out.println(str == str_new);        //-------b
System.out.println(str == str_new_ano);    //-------c
}
}输出:
true //-----a
false //----b
true  //----c
总结:
1:如果pool中已经有一个该字符串,那么只创建一个对象(即引用);如果没有,则创建两个对象,一个是实际的存储对象(在pool中),另一个就是引用了。
2:总是创建两个对象,一个是实际的存储对象,另一个是引用。不知道各位大虾是否同意偶的看法~~~~

解决方案 »

  1.   

    雾里看花。
    你就是真正明白了至少也没有说明白。String literals are references to instances of class String.
    你要揣摩一下这句话。对象(即引用)???no。
      

  2.   

    引用怎么会是对象,一个new 怎么可能创建两个对象?
      

  3.   

    String str_new = new String("test");
    确实是创造了两个对象
      

  4.   

    同意:即使楼主明白了,至少你也没说明白。
    对象是对象,引用是引用。
    创建对象只有new关键字。
    String str_new = new String("test");
    new String("test"):创建对象。
    str_new:对象引用。
      

  5.   

    楼上说的不错,建议你看看java大师bloch的经典书effective java,上面有很多非常棒的供你学习!这个也是.
      

  6.   

    String str_new = new String("test");
    对于上面的语句本人也认为是创建了一个对象。但是网上还有一种说法是创建了两个对象,为什么会出现有两个对象的说法呢,到底哪个是正确的呢,玄机在哪里,请高手点拨,谢谢
      

  7.   

    跑开“对象是对象,引用是引用”这个问题
    关于string的创建,不知道我的理解对不?
      

  8.   

    String str_new = new String("test");
    我个人理解,"test"本身就是一个对象,而用new String()会再产生一个对象,而对象的构造参数为"test",这时生成的String对象即为"test",但和前面的"test"并不是同一个对象,只是内容相同罢了。
    我在C++的理解中是char *str1="test"会在栈存储区中保存"test"
                     char *str2=new String("test"); 会在栈区生成一个str2的字符指针,而在堆区生成一个"test"
    虽然在java中只用引用而已经没有了C++这些概念,但引用其实也是一个指针,实际在内存中的表现应该差不多。
      

  9.   

    楼主,关于String的创建 ,我认为你是对的 有字面量的问题
    不过我也想说一下,只要有new关键字  那么他一定会开辟一个新的内存空间
    另外“对象是对象,引用是引用”  关注!!!
    但我考虑一点,类本身也就是一个对象,Class is class 不知道这句话你听过没
      

  10.   

    http://c06.net/servlet/Report?Node=39450    String详解
      

  11.   

    String str_new_ano = new String("test").intern();
    ================================后面的intern()是干什么用的?