java字串池是儲存在Java堆記憶體中的字串池。String是java中的特殊類,可以使用new
運算子建立String
物件,也可以用雙引號提供值。
下面是一個圖表,清楚地解釋了如何在Java堆空間中維護字串池,以及當使用不同的方法建立字串時會發生什麼。
字串池有助於為Java Runtime節省大量空間,儘管建立String
需要更多時間。
當使用雙引號建立一個String時,它首先在String池中查詢具有相同值的String,如果存在那麼只是返回參照,否則它在池中建立一個新String,然後返回參照。
但是,使用new
運算子,那麼將強制String
類在堆空間中建立一個新的String
物件。可以使用intern()
方法將它放入池中,或者從具有相同值的字串池中參照另一個String
物件。
下面是String池的java範例程式:
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 str = new String("Cat");
在上面的語句中,將建立1
或2
個字串。如果池中已存在字串文字 - Cat
,則池中只會建立一個字串 - str
。如果池中沒有字串文字 - Cat
,那麼它將首先在池中建立,然後在堆空間中建立,因此將建立總共2
個字串物件。