1. ホーム
  2. java

[解決済み] String リテラルに対して String の intern メソッドを使用する必要がある場合

2022-04-24 07:09:33

質問

によると 文字列#intern() , intern メソッドは、文字列が文字列プールに存在する場合はその文字列を返し、存在しない場合は新しい文字列オブジェクトを文字列プールに追加してその文字列の参照を返すことになっています。

そこで、こんなことをやってみた。

String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();

if ( s1 == s2 ){
    System.out.println("s1 and s2 are same");  // 1.
}

if ( s1 == s3 ){
    System.out.println("s1 and s3 are same" );  // 2.
}

と思っていたのですが s1 and s3 are same はs3がインターンしているので出力されます。 s1 and s2 are same は出力されません。しかし、結果は、両方の行が印刷されます。ということは、デフォルトではString定数はinternedになっているということです。しかし、もしそうなら、どうして intern というメソッドがあります。言い換えれば、このメソッドはいつ使うべきなのでしょうか?

どのように解決するのですか?

Java は自動的に String リテラルをインターンします。つまり、多くの場合、==演算子はintや他のプリミティブ値と同じように文字列に対して動作しているように見えるのです。

文字列リテラルでは自動的にインターナルが行われるため intern() メソッドを使用して構築された文字列に対して使用されます。 new String()

あなたの例で言うと

String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();
String s4 = new String("Rakesh");
String s5 = new String("Rakesh").intern();

if ( s1 == s2 ){
    System.out.println("s1 and s2 are same");  // 1.
}

if ( s1 == s3 ){
    System.out.println("s1 and s3 are same" );  // 2.
}

if ( s1 == s4 ){
    System.out.println("s1 and s4 are same" );  // 3.
}

if ( s1 == s5 ){
    System.out.println("s1 and s5 are same" );  // 4.
}

が返ってきます。

s1 and s2 are same
s1 and s3 are same
s1 and s5 are same

を除くすべてのケースで s4 を使用して明示的に作成された値です。 new 演算子で、かつ intern メソッドが使われていない場合、返されるのは単一のイミュータブルなインスタンスです。 JVMの文字列定数プール .

を参照してください。 JavaTechniques "文字列の等価性と内部処理" をご覧ください。