JavaのString Poolとは何ですか?
JavaのString Poolという名前が示す通り、String PoolはJavaのヒープメモリに格納されたStringのプールです。私たちは、StringがJavaで特別なクラスであることを知っており、新しい演算子を使用したり、ダブルクォーテーションで値を提供したりすることで、Stringオブジェクトを作成することができます。
Javaの文字列プール
以下は、JavaのヒープスペースでString Poolが保持される方法と、異なる方法でStringを作成した場合に何が起こるかを明確に説明する図です。String Poolは、JavaにおいてStringが不変であり、Stringのインターニングの概念を実装しているため可能です。String Poolは、Flyweightデザインパターンの例でもあります。String Poolは、Javaランタイムのために多くのスペースを節約するのに役立ちますが、Stringの作成にはより多くの時間がかかります。Stringを作成するためにダブルクォーテーションを使用すると、まずString Pool内で同じ値を持つStringを検索し、見つかれば参照を返し、それ以外の場合は新しいStringを作成してから参照を返します。ただし、new演算子を使用すると、Stringクラスに新しいStringオブジェクトをヒープスペースに作成させることができます。intern()メソッドを使用してStringをプールに入れるか、同じ値を持つ別のStringオブジェクトをString Poolから参照することもできます。以下は、String Poolのイメージに関するJavaプログラムです。
package com.scdev.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プールに関する質問をされることがあります。例えば、以下の文において、いくつの文字列が作成されるかといった質問です。
String str = new String("Cat");
上記の文において、1つまたは2つの文字列が作成されます。もし既に文字列リテラル”Cat”がプールに存在する場合、プール内には1つの文字列”str”が作成されます。もしプールに文字列リテラル”Cat”が存在しない場合、まずプール内に作成され、その後ヒープ領域に作成されるため、合計で2つの文字列オブジェクトが作成されます。読む: Java String インタビューの質問