依其名,Java中的字符串池是存储在Java堆内存中的字符串池。我们知道,在Java中,String是一个特殊的类,我们可以使用`new`运算符创建String对象,也可以直接提供双引号中的值来创建String对象。
Java中的字符串池
這是一個清楚解釋了在Java堆空間中如何維護String Pool以及使用不同方式創建String時會發生什麼的圖表。String Pool之所以存在,是因為Java中的String是不可變的,並且實現了String interning的概念。String Pool也是輕量級設計模式的一個例子。String Pool有助於節省Java運行時的大量空間,儘管創建String需要更多時間。當我們使用雙引號來創建一個String時,它首先在String Pool中尋找具有相同值的String,如果找到,它只返回引用,否則在Pool中創建一個新的String,然後返回引用。但是使用new操作符,我們強制String類在堆空間中創建一個新的String對象。我們可以使用intern()方法將其放入池中,或者引用具有相同值的字符串池中的另一個String對象。以下是String Pool圖像的Java程序:
package com.journaldev.util;
public class StringPool {
/**
* Java String Pool example
* @param args
*/
public static void main(String[] args) {
String s1 = "Cat";
String s2 = "Cat";
String s3 = new String("Cat");
System.out.println("s1 == s2 :"+(s1==s2));
System.out.println("s1 == s3 :"+(s1==s3));
}
}
上述程序的輸出為:
s1 == s2 :true
s1 == s3 :false
推薦閱讀:Java String類
在字符串池中創建了多少個字符串?
有時在Java面試中,你會被問及關於字符串池的問題。例如,在下面的語句中創建了多少個字符串:
String str = new String("Cat");
在上面的語句中,將創建1個或2個字符串。如果字符串池中已經存在字符串常量“Cat”,則只會在池中創建一個字符串“str”。如果字符串池中沒有字符串常量“Cat”,則首先會在池中創建,然後在堆空間中創建,因此總共會創建2個字符串對象。閱讀: Java字符串面試問題
Source:
https://www.digitalocean.com/community/tutorials/what-is-java-string-pool