2012-05-23 56 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

...因爲他們(文學)實習生()編輯 –