2012-05-23 57 views

回答

4

它不同于从池中取出字符串的方式。

1. 当你说,

String str = "stackoverflow" 

它首先会检查是否"stackoverflow"在字符串池已存在。如果是这样,那么它将使用池中的相同内容。

这就是为什么当,

String str1= "stackoverflow"; 
String str2 ="stackoverflow"; 

str1==str2? --> will be true 

的上述结果将是真实的,因为从池同一个String对象使用的原因。

2. 当你这样做,

String str = new String("stackoverflow"); 

始终,将创建一个新的String对象,无论同一个已经存在的游泳池或没有。

所以,

String str1= "stackoverflow"; 
String str2 =new String("stackoverflow"); 
String str3 =new String("stackoverflow"); 

这里,STR2和STR3将再次创造一个新的String对象。

所以,STR2,STR3并且str1所有指不同的销售实物和str2!=str3!=str1

([字符串对象和字符串文字之间的差异]的
+0

很好的分析/解释 –

2

为构造public String(String arg)的Javadoc说:

初始化新创建的字符串对象,它表示字符作为参数相同的序列;换句话说, 新创建的字符串是参数字符串的副本。除非需要显式拷贝原始文件,否则由于字符串是不可变的,因此使用此构造函数是 。

当你 String str = "stackoverflow" 编译器为您从字面创建String对象。

当你这样做: new String("stackoverflow"); 两个是由编译器和你一个创建的。

2

第一行为stackoverflow字符串分配内存。然后它将变量指向这个位置。

第二行为字符串分配空间。然后它创建一个新的String类。它将字符串从第一位复制到内存中的新位置。最后,它将变量指向该位置。

您在第二个示例中所做的就是为计算机创建更多工作,并占用更多内存。

+0

>>>直到下一次垃圾回收:实际上,如果你在GC开始使用 –

+0

时,文字将不会被GCed或'str'噢,让我解决它。 –

+1

...因为他们(文学)实习生()编辑 –