「私はそれを取得できません」という文字列はなぜですか。文字列プールに入る。
"I don't get it."
文字列がインターンプールに入らない。次のようにそれを確認するために
一つの方法は次のとおりです。
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
の作成に使用された文字列定数と同じであるため、すでに中止されています。
あなた自身の違いを確認するには、the firstとthe secondのプログラムを並べて実行できます。
str2 == str3
がtrue
の理由は、文字列プール(スラングワードは"string interning")とは関係ありません。 StringBuffer.append
はが呼び出されたオブジェクト、つまりstr2
を返しますので、2つは等しいです。 2つ目のオブジェクトはありません。StringBuffer
と2つの参照があります。そのStringBuffer
の内容は、" I don't"
と" get it."
の文字列の連結です。
@assylias:はい、それは意志、以来 'アペンド()' 'を返しますthis'。 –
OPは、2つのオブジェクトが等しい理由を明確にしています。問題はなぜ文字列 "私はそれを取得しません"です。文字列プールに格納されます。 –
あなたのインストラクターは間違っているかもしれませんが、StringBuffersの値が* interned *であることを意味する "String pool"に挿入されていれば、それは***間違いです。 – Perception