JavaのString intern()メソッドとは?その役割と使い方をわかりやすく解説
JavaにおけるStringクラスの基本
Stringは、Javaで一連の文字(文字列)を格納するためのクラスで、java.langパッケージに属しています。Stringオブジェクトは一度生成すると内容を変更できない「イミュータブル(不変)」という特性を持っています。
文字列の保存場所
すべてのStringオブジェクトは、ヒープ領域内にある「文字列定数プール(String Constant Pool)」と呼ばれる専用のメモリ領域に格納されます。
文字列リテラルを定義するたびに、JVMは文字列定数プール内にその値を持つStringオブジェクトを生成します。そのため、同じ内容の文字列リテラルが複数存在しても、プール内では1つのオブジェクトとして共有される仕組みになっています。

intern()メソッドとは
intern()メソッドは、一意な文字列値のプール(文字列定数プール)から、現在の文字列に対応する参照を返すメソッドです。ある文字列に対してこのメソッドを呼び出すと、文字列定数プール内に等しい内容の文字列(Objectクラスのequalsメソッドによる判定)が既に存在する場合はその参照が返されます。存在しない場合は、現在の文字列がプールに追加され、その参照が返されます。
つまり、同じ内容を持つ2つの文字列に対してこのメソッドを呼び出せば、両者が必ず同じメモリ領域を共有することが保証されます。
このメソッドは、重複した文字列が大量に存在する場合にメモリ使用量を抑えたい場面で特に役立ちます。
例1:intern()を使わない場合
次の例では、newキーワードを使って同じ内容の2つのStringオブジェクトを生成し、「==」演算子で比較しています。両者の値は同じでも、それぞれ別のオブジェクト(異なるメモリ領域)を参照しているため、結果はfalseになります。
public class InternExample {
public static void main(String args[]) {
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
}
}実行結果
false
例2:intern()を使った場合
一方、比較の前に両方のオブジェクトに対してintern()メソッドを呼び出すとどうなるでしょうか。intern()によって、同じ内容の文字列は同じメモリ領域を共有することが保証されるため、結果はtrueになります。
public class InternExample {
public static void main(String args[]) {
String str1 = new String("Hello");
str1 = str1.intern();
String str2 = new String("Hello");
str2 = str2.intern();
System.out.println(str1 == str2);
}
}実行結果
true
まとめ
intern()メソッドを利用することで、内容が同じ文字列同士が同一のオブジェクトを参照するようになり、メモリの節約につながります。ただし、intern()の呼び出し自体にも処理コストがかかるため、大量の重複文字列を扱うケースなど、適切な場面で活用することが大切です。
-
JavaのStringIndexOutOfBoundsExceptionとは?発生原因と対処法をわかりやすく解説
StringIndexOutOfBoundsExceptionとはJavaにおいて、文字列(String)は一連の文字を格納するために使用され、オブジェクトとして扱われます。文字列は、java.langパッケージに含まれるStringクラスによって表現されます。文字列の作成方法は主に2つあります。1つは他のオブジェクトと同様にnewキーワードを使用する方法、もう1つはプリミティブ型のようにリテラルを直接代入する方法です。String stringObject = new String(Hello how are you); String stringLiteral = Welcome to T
-
JavaのsetBounds()メソッドとは?使い方とサンプルコードを解説
JavaのGUIプログラミングでは、レイアウトマネージャー(Layout Manager)がコンポーネントの位置やサイズを自動的に決定します。しかし、レイアウトマネージャーを使用しない場合は、コンポーネントの位置とサイズを手動で設定する必要があります。そのような場面で活躍するのがsetBounds()メソッドです。フレームのレイアウトマネージャーをnullに設定することで、コンポーネントの位置とサイズを自由に指定できるようになります。setBounds()メソッドの基本setBounds()メソッドは4つの引数を取ります。第1引数と第2引数はコンポーネントの左上隅のx座標・y座標、第3引数はコ