Java

Stringのintern()メソッドとは?Java初心者の勉強

Java icon

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

解説

string_constant_pool image

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/

POSTED COMMENT

  1. TH より:

    追記
    str3.intern() の挙動

    公式より
    internメソッドが呼び出されたときに、
    equals(Object)メソッドによってこのStringオブジェクトに等しいと判定される文字列がプールにすでにあった場合は、プール内の該当する文字列が返されます。そうでない場合は、このStringオブジェクトがプールに追加され、このStringオブジェクトへの参照が返されます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です