JavaのStringクラスintern()メソッドとは?文字列プールの仕組みとメモリ節約の使いどころを解説
JavaのStringクラスが提供するintern()メソッドは、文字列の重複問題に対処するための強力な仕組みです。重複した文字列インスタンスが消費するメモリを大幅に節約できます。ここで「重複した文字列」とは、内容は同じでも異なるメモリ位置に存在する文字列を指します。
文字列プール(String Pool)の仕組み
JVMはパフォーマンス向上のため、文字列リテラル専用の独立したヒープ領域(文字列プール)を管理しています。文字列リテラルを宣言すると、その値はまずこのプールに登録されます。その後、別の変数に同じリテラル値を代入した場合には、新しくオブジェクトを生成してヒープに格納するのではなく、プールから既存のオブジェクトが再利用されます。
一方、newキーワードを使って文字列を生成した場合は、プールに同じ内容のリテラルがすでに存在していても、必ず新しいオブジェクトがヒープ上に作成されます。この無駄なオブジェクト生成を避け、JVMにプール内のリテラルを強制的に参照させるためにintern()メソッドが活用されます。
intern()メソッドの主な使いどころ
実は、Javaではデフォルトですべての文字列リテラルが自動的にインターン化されます。そのため、intern()メソッドが特に役立つのは、new String()で生成した文字列を==演算子で比較したい場合です。intern()を呼び出してプール上の参照を取得すれば、equals()メソッドを使わずに==演算子で同一性を比較できるようになります。
サンプルコード
public class StringInternClassTest {
public static void main(String[] args) {
String s1 = "Tutorix";
String s2 = "Tutorix";
String s3 = new String("Tutorix");
final String s4 = s3.intern();
String s5 = "?Tutorix".substring(1);
String s6 = s5.intern();
System.out.println(s1 == s2);
System.out.println(s2 == s3);
System.out.println(s3 == s4);
System.out.println(s1 == s3);
System.out.println(s1 == s4);
System.out.println(s1 == s5);
System.out.println(s1 == s6);
System.out.println(s1.equals(s2));
System.out.println(s2.equals(s3));
System.out.println(s3.equals(s4));
System.out.println(s1.equals(s4));
System.out.println(s1.equals(s3));
}
}
実行結果
true false false false true false true true true true true true
実行結果の解説
s1とs2は同じリテラルを参照しているためtrue、s3はnewで生成された別オブジェクトのためfalseになります。s4はintern()によってプール上の参照を返すため、s1と一致してtrueです。s5はsubstring()で実行時に生成された新しいオブジェクトなのでfalseですが、intern()を呼び出したs6はプールの参照を得られるためtrueとなります。一方、equals()メソッドはオブジェクトの同一性ではなく内容を比較するため、すべてのケースでtrueを返します。
-
JavaのString intern()メソッドとは?その役割と使い方をわかりやすく解説
JavaにおけるStringクラスの基本Stringは、Javaで一連の文字(文字列)を格納するためのクラスで、java.langパッケージに属しています。Stringオブジェクトは一度生成すると内容を変更できない「イミュータブル(不変)」という特性を持っています。文字列の保存場所すべてのStringオブジェクトは、ヒープ領域内にある「文字列定数プール(String Constant Pool)」と呼ばれる専用のメモリ領域に格納されます。文字列リテラルを定義するたびに、JVMは文字列定数プール内にその値を持つStringオブジェクトを生成します。そのため、同じ内容の文字列リテラルが複数存在して
-
Javaのpack()メソッドとは?使い方とsetSize()との違いを解説
pack()メソッドは、JavaのWindowクラスで定義されているメソッドで、フレーム内のすべてのコンポーネントがそれぞれの推奨サイズ(preferred size)以上で表示されるように、ウィンドウのサイズを自動的に調整します。 代替手段として、setSize()メソッドやsetBounds()メソッドを呼び出して、フレームのサイズを明示的に指定する方法もあります。しかし一般的には、pack()メソッドを使用する方がsetSize()よりも推奨されています。その理由は、pack()がフレームのサイズ決定をレイアウトマネージャーに委ねることができ、レイアウトマネージャーはプラットフォーム間の