String obj = null;
obj= new String("Samuel");
//vs
String obj = null;
obj="Samuel";
這兩種初始化字符串的方法有什麼區別嗎?這兩種初始化字符串的方式有什麼區別?
String obj = null;
obj= new String("Samuel");
//vs
String obj = null;
obj="Samuel";
這兩種初始化字符串的方法有什麼區別嗎?這兩種初始化字符串的方式有什麼區別?
String obj = new String("Samuel");
String obj1 = new String("Samuel");
// VS
String obj = "Samuel";
String obj1 = "Samuel";
在
obj==obj1
返回
obj==obj1
返回true第二種情況下假
第一殼體
。
原因是在第一種情況下,您有兩個對兩個不同對象的引用。在第二種情況下,你有一個對象,因爲字符串是不可變的,它們是interned,並且來自同一個池。
是的。總是喜歡第二種選擇。
第一個創建一個不必要的字符串實例。字符串文字(字符串周圍的兩個引號)自己創建一個字符串對象。然後,如果使用第一個選項,則會創建另一個不必要的實例。
當您僅使用字符串文字(第2個選項)時,jvm使用一個表格存儲規範字符串對象。因此對於用"Samuel"
聲明的所有字符串,JVM中只有一個實例。但是,如果使用構造函數String(str)
,則會有更多的實例,這意味着更多的內存。
要回答評論中的後續問題:這僅適用於字符串。所有其他對象都是通過構造函數創建的,因爲它們沒有指定的文字。
例如,您需要Car car = new Car("honda", "civic")
。只有("honda, "civic")
不是一個有效的語法 - 它無法知道你創建了什麼類型。
因此,s1 == s2
將是錯誤的,s1.equals(s2)
將爲真。第一種類型的聲明字符串稱爲「字符串文字」,第二種類型的聲明字符串稱爲「字符串對象」。字符串文字用於優化內存的使用並有效地管理內存。
我試圖獲得這兩種情況下的哈希碼,並且它爲兩種初始化obj方式打印完全相同的哈希碼。 似乎沒有區別? –
hashCodes的相等並不意味着相等,並且相等並不意味着標識。 – EJP
[初始化Java中的字符串]的可能的重複(http://stackoverflow.com/questions/7021027/initializing-a-string-in-java) – EJP