「I don't get it.」という文字列が表示されるのはなぜですか。ストリングプールに入ります。
文字列は"I don't get it."インターニング プールに入りません。
それを確認する 1 つの方法は次のとおりです。
StringBuffer str2 = new StringBuffer(" I don't");
StringBuffer str3 = str2.append(" get it.");
String str = new String(str3.toString());
if (str == str.intern()) {
System.out.println("It was not interned before"); // <<== This is printed
} else {
System.out.println("It was interned before");
}
Stringのコンテンツがインターンされている場合、 の呼び出しは別intern()の (「正規の」) オブジェクトを返します。ご覧のとおり、上記は同じオブジェクトを返します。つまり、呼び出したオブジェクトがintern()「正規の」オブジェクトになった (つまり、インターンされた) ことを意味します。
一方、 を削除するappendと、別の結果が得られます。
StringBuffer str2 = new StringBuffer(" I don't");
StringBuffer str3 = str2;
String str = new String(str3.toString());
if (str == str.intern()) {
System.out.println("It was not interned before"); // <<== This is printed
} else {
System.out.println("It was interned before");
}
現在、内部の文字列str3は" I don't". の作成に使用された文字列定数と同じであるため、そのコピーは既にインターンされていますstr2。
最初のプログラムと2 番目のプログラムを並べて実行して、違いを自分で確認できます。
その理由str2 == str3はtrue文字列プールとは何の関係もありません (俗語は"string interning"です)。が呼び出されたオブジェクト、つまりStringBuffer.appendを返すため、この 2 つは等しいです。2 番目のオブジェクトはありません。2 つの参照を持つオブジェクトは 1 つだけです。その内容はと文字列の連結です。appendstr2StringBufferStringBuffer" I don't"" get it."