「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 つだけです。その内容はと文字列の連結です。append
str2
StringBuffer
StringBuffer
" I don't"
" get it."