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
添加回答
舉報