🎉
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