[英]strings in java behave differently
如果是字符串文字:-
String s = "happ"
s = s.concat("y") //line1
在第一個示例中:
String s = "happ";
s = s.concat("y");
在執行這些語句1時 , 已經在字符串池中創建了String
對象,以分別表示"happ"
文字和"y"
文字。
第二條語句的執行將創建一個新的String
對象,該對象表示字符串"happy"
。 該對象不在字符串池中。
我想特別澄清這個疑問:在對池或堆中的字符串進行操作時,字符串將concat方法的結果存儲在何處。
它是在堆2中創建的,而不是在字符串池中創建的。 特別。
String
API中在字符串池中創建對象的唯一方法是String.intern()
。 (包括構造函數。)
1-在這里請注意我對單詞的謹慎選擇。 如果您是第一次執行語句,則在執行語句期間可能已經在字符串池中創建了對象。 或者它可能曾經發生過。 確切的時間是特定於實現的。 但是,JLS保證對於相同的文字不會發生多次。
2-請注意,對於現代的HotSpot JVM,字符串池位於常規堆中。 它不是一個單獨的空間。 字符串池實際上只是一個(JVM專用)數據結構。
讓我們嘗試一下。
String s = "happ";
s = s.concat("y");
System.out.println(s == "happy"); // false
s = s.intern();
System.out.println(s == "happy"); // true
String s1 = new String("Birth");
s1 = s1.concat("day");
System.out.println(s1 == "Birthday"); // false
s1 = s1.intern();
System.out.println(s1 == "Birthday"); // true
是的,沒關系。 在這里只保留文字,不動態構造值(除非顯式保留)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.