名前の通り、JavaのString PoolはJava Heap Memoryに格納されたStringのプールです。StringはJavaの特別なクラスであり、new演算子を使用したり、ダブルクォーテーションで値を提供したりしてStringオブジェクトを作成できます。
JavaのString Pool
以下は、Javaヒープ領域でString Poolがどのように維持され、さまざまな方法でStringを作成すると何が起こるかを明確に説明した図です。String Poolは、JavaではStringが不変であるということ、およびStringインターニングの概念を実装していることによって可能になります。String Poolはまた、Flyweightデザインパターンの例でもあります。String Poolは、Javaランタイムのために多くのスペースを節約するのに役立ちますが、Stringの作成にはより多くの時間がかかります。Stringを作成するために二重引用符を使用すると、まずString Pool内に同じ値を持つStringがあるかどうかを確認し、あればその参照を返し、なければ新しいStringをPool内に作成してから参照を返します。ただし、new演算子を使用すると、Stringクラスに新しいStringオブジェクトをヒープ領域に作成するように強制します。
intern()
メソッドを使用して、Stringをプールに追加したり、同じ値を持つStringプール内の別の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” という1つの文字列がプールに作成されます。もし文字列リテラル “Cat” がプールにない場合、まずプールに作成され、次にヒープ領域に作成されるので、合計で2つの文字列オブジェクトが作成されます。読む: Java String インタビューの質問
Source:
https://www.digitalocean.com/community/tutorials/what-is-java-string-pool