Stringのintern()メソッドについてです。
intern()メソッドとは
intern()メソッドを使うと、Stringで生成した文字を明示的にインターン化(interning)することが可能です。
インターン化とは
インターン化すると文字列がString Constant Poolにあるか確認し、すでにあればその文字列を返します。
なければString Constant Poolのその文字列を追加し返します。
String Constant Poolについては以下でまとめています。合わせて読んでいただくと理解が深まると思います。
構文
string.intern();
インターン化された文字列が戻されます。
インターン化前の例
インターン化と言っても言葉ではうまく伝えられないのでサンプルコードとイメージで説明していきます。
まずはインターン化前です。
サンプルコード
String str1 = new String(“Hello”);
String str2 = “Hello”;
System.out.println(str1 == str2); // false
解説
newで明示的にインスタンス化した文字列と、通常の方法で文字列を生成した場合では参照が異なります。
インターン化の例
それではintern()メソッドを使ってみます。
サンプルコード
String str1 = new String(“Hello”);
String str2 = “Hello”;
System.out.println(str2 == str1.intern()); // true
System.out.println(str1 == str2); // false
解説
インターン化するとStringコンスタントプールに同じ文字列がないか確認し、あればその文字列を返します。
インターン化おまけ
もうひとつくらい例をあげておきます。
String str3 = new String(“Hi”);
String str4 = new String(“Hi”);
System.out.println(str3 == str4); // false
System.out.println(str3.intern() == str4.intern());// true
解説
イラストは省略しますが、ヒープ領域にある「Hi」がStringコンスタントプールにあるか確認し、なければStringコンスタントプールに追加します。str4がintern化する時にはstr3がintern化した時に作成されたStringコンスタントプールが戻されるため同じ参照となります。
おわり
目に見えないものの動きを確認するのは難しいですね。簡単に確認する方法はあるんだろうか。
intern()自体は簡単なのですが、きちんと理解しようとすると時間がかかりますね。
にしてもinternってそんなに使うものなのだろうか。
参考
https://www.geeksforgeeks.org/interning-of-string/
追記
str3.intern() の挙動
公式より
internメソッドが呼び出されたときに、
equals(Object)メソッドによってこのStringオブジェクトに等しいと判定される文字列がプールにすでにあった場合は、プール内の該当する文字列が返されます。そうでない場合は、このStringオブジェクトがプールに追加され、このStringオブジェクトへの参照が返されます。
THさん
追記コメントありがとうございます。
String (Connected Device Configuration (CDC), バージョン 1.1.2)