Java intern() メソッド
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 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);
-
str1str1 は定数プールを指し、,str2str2 はヒープ内のオブジェクトを指しているので、、==比較されるのは異なるメモリアドレスで、結果は false になりますfalse。
System.out.println(str1 == str3);
-
str3intern() を呼び出した後intern()、str2 は定数プール内の文字列を指し、、str1str1 と同じオブジェクトを指しているため、結果は true になりますtrue。
上記のプログラムの実行結果は次のとおりです:
false true
その他の拡張
Java String クラス