Java中的字串池概念
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 |
相關文章
- 正確理解和使用JAVA中的字串常量池Java字串
- Java中的字串Java字串
- Java常量池解析與字串intern簡介Java字串
- 字串常量池字串
- java基礎:String — 字串常量池與intern(二)Java字串
- Java 中的物件池實現Java物件
- Java String類,字串常量池,建立方法,字串的獲取,擷取,轉換,分割。Java字串
- 好好說說Java中的常量池之Class常量池Java
- JAVA虛擬機器-方法區與字串常量池Java虛擬機字串
- Java中的物件導向(OOPs)概念 - 四個主要概念Java物件OOP
- Java中,那些關於String和字串常量池你不得不知道的東西Java字串
- 執行緒池的基本概念執行緒
- 淺析Java中的執行緒池Java執行緒
- 不再怕面試被考字串---詳解Java中的字串面試字串Java
- java的常量池Java
- 聊聊面試中的 Java 執行緒池面試Java執行緒
- Java 中 CLOB 和字串之間的轉換Java字串
- 簡單瞭解下Java中鎖的概念和原理Java
- 探討Java中的多執行緒概念 - foojayJava執行緒
- Java中PO、DO、TO、DTO、 VO、 BO、POJO 、DAO的概念JavaPOJO
- 詳解執行緒池的作用及Java中如何使用執行緒池執行緒Java
- Spider pool 蜘蛛池的概念和原理白狐公羊seoIDE
- Java中的字串操作(比較String,StringBuiler和StringBuffer)Java字串UI
- 在Java中反轉字串的10種方法[Snippets]Java字串
- JAVA中字串比較equals()和equalsIgnoreCase()的區別Java字串
- 20220406Java字串操作類中scompareTo()Java字串
- Java程式碼中字串拼接方式分析Java字串
- Java 8中字串拼接新姿勢:StringJoinerJava字串
- 徹底搞清楚class常量池、執行時常量池、字串常量池字串
- Java 中執行緒池的7種建立方式!Java執行緒
- Java™ 教程(比較字串和字串的部分)Java字串
- java字串Java字串
- Java —— 流的基本概念Java
- Java中字串記憶體位置淺析Java字串記憶體
- java中執行緒池的生命週期與執行緒中斷Java執行緒
- java——split的用法(字串拆分)Java字串
- java生成json字串的方法JavaJSON字串
- Python中的字串Python字串