2 回答
TA貢獻1784條經驗 獲得超9個贊
new String("text");?顯式創建一個新的和引用不同的String對象實例;?String s = "text";可以重用字符串常量池中的實例(如果有)。
你很少想要使用new String(anotherString)構造函數。來自API:
String(String original):初始化新創建的?String對象,使其表示與參數相同的字符序列;?換句話說,新創建的字符串是參數字符串的副本。除非需要顯式的原始副本,否則不需要使用此構造函數,因為字符串是不可變的。
什么參考區別意味著什么
檢查以下代碼段:
????String?s1?=?"foobar";
????String?s2?=?"foobar";
????System.out.println(s1?==?s2);??????//?true
????s2?=?new?String("foobar");
????System.out.println(s1?==?s2);??????//?false
????System.out.println(s1.equals(s2));?//?true==兩種引用類型是引用標識比較。兩個equals不一定的對象==。==在引用類型上使用通常是錯誤的;?大部分時間都equals需要使用。
盡管如此,如果出于某種原因需要創建兩個equals但不是==字符串,則可以使用new String(anotherString)構造函數。然而,需要再說一遍,這是非常奇特的,很少是意圖。
TA貢獻1780條經驗 獲得超4個贊
字符串文字將進入字符串常量池。
下面的快照可能會幫助您直觀地理解它以便記住它更長的時間。
逐行創建對象:
String str1 = new String("java5");在構造函數中使用字符串文字“java5”,新的字符串值存儲在字符串常量池中。使用new運算符,在堆中創建一個新的字符串對象,并將“java5”作為值。
String str2 = "java5"
引用“str2”指向字符串常量池中已存儲的值
String str3 = new String(str2);
在堆中創建一個新的字符串對象,其值與“str2”引用的值相同
String str4 = "java5";
引用“str4”指向字符串常量池中已存儲的值
總對象:堆 - 2,池 - 1
添加回答
舉報
