Java中的字串池概念

banq發表於2021-11-11

String 物件是 Java 語言中最常用的類之一。Java 中的字串是由字元陣列內部支援的物件。由於陣列是不可變的,字串也是不可變的。每當對 String 進行更改時,都會建立一個全新的 String。
 

如何建立字串
在java中有兩種不同的方法來建立一個String物件。
第一種方法是使用文字或常量表示式:

String stringWithLiteral = "some Text"; //string literal
String stringWithConstant = "some " + "Text"; //constant expression



第二種方法是使用“new”關鍵字:

String stringWithNew = "some Text";



不可變字串
字串是常量,這意味著它們的值在建立後無法更改。如果 String 在 Java 中不是不變的,則字串池是不可能的。字串在 Java 中是不可變的有一些原因。

  • 如果 String 不是不可變的,它將構成安全威脅。例如,使用者名稱和密碼作為字串傳遞。字串是不可變的,所以它的值在建立後不能改變。如果 String 不是不可變的,任何人都可以透過更改敏感資訊在應用程式中引起安全問題。
  • 由於其不可變性,String 對於多執行緒是安全的。不同的執行緒可以訪問單個“字串例項”。它刪除了執行緒安全的同步,因為我們隱式地使字串執行緒安全。
  • JVM 類載入器在載入類時也使用字串。不變性為 Classloader 載入正確的類提供了安全性。

 

字串池
String Pool 是堆記憶體中的一個儲存區域。物件分配在時間和記憶體的情況下都是昂貴的。JVM 在初始化 String 時執行一些步驟以提高效能並減少記憶體使用。為了減少在 JVM 中建立的 String 物件的數量,String 類保留了一個字串池。
JVM 可以透過在池中僅儲存每個文字字串的一個副本來最佳化為字串分配的記憶體量。這個過程稱為字串實習String Interning.。
當我們建立一個字串字面量時,JVM 會在字串池中搜尋具有相等值的字串。如果字串已存在於字串池中,則返回對池化例項的引用。如果字串不存在於字串池中,則會初始化一個新的字串物件並將其放入字串池中。
 

Java 中的字串池是如何工作的
當我們使用文字或常量表示式建立新的 String 物件時,JVM 會檢查 String Pool 中是否存在相同的值。

String str1 = "Java"
String str2 = "Java"

如果字串池已包含此字串文字,則返回現有物件的例項。如果字串池不包含此字串文字,則會建立一個新字串並將其新增到字串池中。
如果要更改此行為,請使用 new 關鍵字建立一個字串:

String str3 = new String("Java")

使用“new”關鍵字建立一個新的 String 例項,即使它已經在 String Pool 中。
Java 提供了一種稱為 intern 的本地方法:使用這種方法,我們可以將此字元新增到字串池中。此方法還返回實習字串。

String str4 = str3.intern()


字串池的程式碼示例
在展示 String Pool 的例子之前,需要提醒的是 Java 中的 == 運算子會檢查記憶體中的地址是否相等。因此,我們將使用 == 運算子比較字串以確保它們是相同的物件。

String str1 = "Java";
String str2 = "Java";
String str3 = new String("Java");
String str4 = new String("Java").intern();        
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1 == str4); // true


 

相關文章