Java intern() メソッド

Java String类Java String クラス


intern() メソッドは、実行時に文字列を内部の文字列プールに追加し、文字列プール内の参照を返すために使用されます。

intern() メソッドを呼び出すと、文字列定数プールにその文字列がすでに含まれている場合はプール内の参照を返し、プールにその文字列がない場合はプールに追加し、その文字列の参照を返します。

intern() メソッドは次の規則に従います:任意の2つの文字列 s と t について、s.equals(t) が true である場合に限り、s.intern() == t.intern() も true となります。

String s1 = new String("Hello");
String s2 = "Hello";
String s3 = s1.intern();

System.out.println(s1 == s2);  // false
System.out.println(s2 == s3);  // true

構文

public String intern()

パラメータ

  • 无

戻り値

intern() メソッドの戻り値は、文字列の文字列定数プール(String Pool)内の参照です。

戻り値の規則:

  • 文字列定数プールにすでに存在する場合:その文字列:プール内にすでにある文字列の参照を返します。
  • 文字列定数プールに存在しない場合:その文字列:現在のヒープ内の文字列参照を定数プールに格納し(新しいオブジェクトを作成するのではなく)、その参照を返します。

Java バージョンの違い:

  • JDK 6 以前では、文字列定数プールはメソッド領域(パーマネント世代)に格納され、容量に制限があるため、 intern() を多用すると OutOfMemoryError が発生する可能性があります。

  • JDK 7 以降では、文字列定数プールはヒープメモリに移動され、より多くのデータを格納できます。

例

以下の例は、 intern() メソッドの適用を示しています。

例

public class サンプルTest {
    public static void main(String args[]) {
        // str1 は文字列リテラル "サンプル" を直接代入します。これは文字列定数プール(String Pool)に格納されます。
        String str1 = "サンプル";

        // str2 は new キーワードを使用して作成され、ヒープ(Heap)メモリに格納されます。
        String str2 = new String("サンプル");

        // str3 は str2 が intern() メソッドを呼び出した後に取得される参照です。
        // intern() メソッドは "サンプル" を文字列定数プールに入れ、プール内の参照を返します。
        String str3 = str2.intern();

        // str1 と str2 の比較
        // str1 は定数プール内の "サンプル" を指し、 str2 はヒープメモリ内のオブジェクトを指します。
        // それらのアドレスが異なるため、結果は false になります。
        System.out.println(str1 == str2);  // false

        // str1 と str3 の比較
        // str3 は str2 が intern() メソッドを呼び出した後に返される参照で、定数プール内の "サンプル" を指します。
        // 一方、 str1 も定数プール内の "サンプル" を指しているため、それらのアドレスは同じで、結果は true になります。
        System.out.println(str1 == str3);  // true
    }
}

コードの説明:

String str1 = "サンプル";

  • 文字列リテラルを直接代入すると "サンプル"、それは自動的に文字列定数プールに格納されます(String Pool)内に。

String str2 = new String("サンプル");

  • new キーワードを使用するためnew、それはヒープ(Heap)内に新しい文字列オブジェクトを作成します、つまりstr2 定数プールを指すのではなく、新しいメモリアドレスを指します。

String str3 = str2.intern();

  • intern()intern() メソッドは文字列が"サンプル"すでに文字列定数プールに存在するかどうかをチェックします:

    • 存在する場合、その文字列の参照を返します;

    • 存在しない場合、それを定数プールに追加し、プール内の参照を返します。

  • str1 はstr1 すでに定数プールにあるため、str3とstr1str2 は同じオブジェクトを指します。

System.out.println(str1 == str2);

  • str1 str1 は定数プールを指し、,str2 str2 はヒープ内のオブジェクトを指しているので、、==比較されるのは異なるメモリアドレスで、結果は false になりますfalse。

System.out.println(str1 == str3);

  • str3intern() を呼び出した後intern()、str2 は定数プール内の文字列を指し、、str1str1 と同じオブジェクトを指しているため、結果は true になりますtrue。

上記のプログラムの実行結果は次のとおりです:

false
true

Java String类Java String クラス

その他の拡張