這兩條語句有什麼區別?字符串原始類型/字符串類的區別?
String str = "stackoverflow";
&
String str = new String("stackoverflow");
這兩條語句有什麼區別?字符串原始類型/字符串類的區別?
String str = "stackoverflow";
&
String str = new String("stackoverflow");
它不同於從池中取出字符串的方式。
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
很好的分析/解釋 –
爲構造public String(String arg)
的Javadoc說:
初始化新創建的字符串對象,它表示字符作爲參數相同的序列;換句話說, 新創建的字符串是參數字符串的副本。除非需要顯式拷貝原始文件,否則由於字符串是不可變的,因此使用此構造函數是 。
當你 String str = "stackoverflow"
編譯器爲您從字面創建String對象。
當你這樣做: new String("stackoverflow");
兩個是由編譯器和你一個創建的。
Java有一個字符串池。更多信息:http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3
+1。您分享的鏈接可以精確解釋差異。 – verisimilitude
第一行爲stackoverflow字符串分配內存。然後它將變量指向這個位置。
第二行爲字符串分配空間。然後它創建一個新的String類。它將字符串從第一位複製到內存中的新位置。最後,它將變量指向該位置。
您在第二個示例中所做的就是爲計算機創建更多工作,並佔用更多內存。
>>>直到下一次垃圾回收:實際上,如果你在GC開始使用 –
時,文字將不會被GCed或'str'噢,讓我解決它。 –
...因爲他們(文學)實習生()編輯 –
可能重複http://stackoverflow.com/questions/3297867/difference-between-字符串對象和字符串文字) – EJP