toString().intern()中的intern()中的作用和使用

捞月亮的小北發表於2024-06-30

在Java中,toString().intern()​這個表示式通常用在一個物件的字串表示上,用於將該字串物件放入字串池(String Pool)中,並返回字串池中該字串的引用。這裡分兩部分來解釋:

  1. toString() : 這是一個方法,用於返回物件的字串表示形式。幾乎所有的Java類都繼承自Object​類,而Object​類中定義了toString()​方法。預設的實現通常返回類名和物件的記憶體地址的雜湊碼形式,但很多類會重寫這個方法以提供更有意義的字串表示。例如,一個Person​類可能會重寫toString()​方法來返回人的名字和年齡等資訊。
  2. intern() : 這是String​類的一個方法。當呼叫一個字串物件的intern()​方法時,JVM會檢查字串池中是否存在相同內容的字串。如果存在,則直接返回字串池中該字串的引用;如果不存在,則將當前字串物件新增到字串池中,並返回這個新增進池中的字串引用。這樣可以確保字串池中不會存在重複的字串例項,有助於節省記憶體。

使用場景和目的:

  • 記憶體最佳化: 透過複用字串池中的字串,可以減少多個相同內容字串的例項,從而節省記憶體。
  • 效能提升: 比較兩個透過intern()​方法處理過的字串時,由於它們可能指向同一個記憶體地址(如果內容相同),比較操作更快。
  • 一致性: 在某些需要確保字串唯一性或比較相等情況的場景下,使用intern()​可以幫助維持資料的一致性。

示例:

String str1 = new StringBuilder("Hello").toString(); // 建立一個新的字串物件
String str2 = str1.intern(); // 將str1的值放入字串池,並返回池中的引用

String str3 = "Hello"; // 直接從字串池中獲取"Hello"

System.out.println(str1 == str2); // 可能為false,取決於是否之前有"Hello"進入過字串池
System.out.println(str2 == str3); // 為true,因為str2和str3都指向字串池中的"Hello"

需要注意的是,過度使用intern()​可能導致記憶體佔用增加,尤其是在處理大量唯一字串時。因此,應當根據具體場景合理應用intern()​方法。

相關文章