2011-10-23 75 views
2
String obj = null; 
obj= new String("Samuel"); 

//vs 

String obj = null; 
obj="Samuel"; 

這兩種初始化字符串的方法有什麼區別嗎?這兩種初始化字符串的方式有什麼區別?

+0

我試圖獲得這兩種情況下的哈希碼,並且它爲兩種初始化obj方式打印完全相同的哈希碼。 似乎沒有區別? –

+2

hashCodes的相等並不意味着相等,並且相等並不意味着標識。 – EJP

+0

[初始化Java中的字符串]的可能的重複(http://stackoverflow.com/questions/7021027/initializing-a-string-in-java) – EJP

回答

4
String obj = new String("Samuel"); 
String obj1 = new String("Samuel"); 

// VS

String obj = "Samuel"; 
String obj1 = "Samuel"; 
obj==obj1返回 obj==obj1返回true第二種情況下假

第一殼體

原因是在第一種情況下,您有兩個對兩個不同對象的引用。在第二種情況下,你有一個對象,因爲字符串是不可變的,它們是interned,並且來自同一個池。

7

是的。總是喜歡第二種選擇。

第一個創建一個不必要的字符串實例。字符串文字(字符串周圍的兩個引號)自己創建一個字符串對象。然後,如果使用第一個選項,則會創建另一個不必要的實例。

當您僅使用字符串文字(第2個選項)時,jvm使用一個表格存儲規範字符串對象。因此對於用"Samuel"聲明的所有字符串,JVM中只有一個實例。但是,如果使用構造函數String(str),則會有更多的實例,這意味着更多的內存。

要回答評論中的後續問題:這僅適用於字符串。所有其他對象都是通過構造函數創建的,因爲它們沒有指定的文字。
例如,您需要Car car = new Car("honda", "civic")。只有("honda, "civic")不是一個有效的語法 - 它無法知道你創建了什麼類型。

+2

宇,2 downvotes一個正確的答案 – Bozho

+2

謝謝,他們現在走了。但爲了記錄:當你在回答中看到「-1」時,不要相信僅僅是給出另一個「-1」 – Bozho

+2

我覺得我在周圍看到很多「同情心」,無論是在問題*和*答案中。 –

0

因此,s1 == s2將是錯誤的,s1.equals(s2)將爲真。第一種類型的聲明字符串稱爲「字符串文字」,第二種類型的聲明字符串稱爲「字符串對象」。字符串文字用於優化內存的使用並有效地管理內存。

相關問題