Java String Pool とは?

名前の通り、JavaのString PoolJava 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