🎉

Javaにおける.intern()について

に公開

今回は文字列インターン化(String Interning)について解説します。

この処理について一言で言うと、「新しく作った文字列オブジェクトを、メモリを節約するために『共有プール』に登録し、その参照(場所情報)を返す」という意味になります。

String s4 = new String("Java").intern();
1.new String("Java")

通常のオブジェクト作成と同じように、メモリ上の「ヒープ領域」に新しいStringインスタンスを強制的に作成します。

2..intern()

このメソッドが呼ばれると、JVM(Java仮想マシン)は「文字列定数プール(String Constant Pool)」という特別な領域をチェックします。

プール内に "Java" という文字列が既にある場合: その既存の文字列への参照を返します。
プール内にない場合: この新しい文字列をプールに追加し、その参照を返します。

3.String s4 = ...

最終的に、プール内にある「共有された文字列」の参照が s4 に代入されます。

なぜこれを行うのか?(メリット)

メモリの節約: 同じ内容の文字列がプログラム内で大量に作られる場合、それらを1つに集約することでメモリ消費を抑えられます。

比較の高速化: intern() された文字列同士であれば、equals() メソッドを使わずに ==(参照比較)だけで同一性を判定できるため、処理が速くなります。

※注意:
通常、String s = "Java"; と書くだけでJavaは自動的にプールを利用します。そのため、new String(...).intern() という書き方は、外部から読み込んだ動的な文字列をプールに登録したい場合などの特殊なケースで使われます。

Discussion