簡體   English   中英

Java中的字符串行為不同

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM