15
public static void main(String[] args) {
    String str1 = new StringBuilder("计算机").append("软件").toString();
    System.out.println(str1.intern() == str1);
    String str2 = new StringBuffer("ja").append("va").toString();
    System.out.println(str2.intern() == str2);
}

結果:

 true
 false   

最初のものは を出力trueし、2 番目は を出力しfalseます。結果が異なるのはなぜですか?

4

4 に答える 4

20

動作の違いは、 と の違いとは無関係StringBuilderですStringBuffer

String#intern()それが返す状態のjavadoc

intern メソッドが呼び出されたときに、メソッドによって決定されたこのオブジェクトと等しい文字列がプールに既に含まれている場合は、プール からの文字列が返されStringequals(Object)ます。それ以外の場合、この Stringオブジェクトはプールに追加され、このオブジェクトへの参照String が返されます。

Stringから作成された

String str2 = new StringBuffer("ja").append("va").toString();

Stringプールに属さない新品です。

為に

str2.intern() == str2

を返すfalseには、intern()呼び出しが別の参照値を返している必要があります。String "java"すでにプールにありました

最初の比較では、String「计算機软件」はへの呼び出しのintern()に文字列プールにありませんでした。intern()したがって、 は に格納されているものと同じ参照を返しましたstr2。したがって、参照等価str2 == str2は を返しますtrue

于 2015-08-14T01:38:55.090 に答える
5

あなたの割り当てはインターン プールから再読み込みされず、JavaStringは不変であるためです。検討

String str1 = new StringBuilder("计算机").append("软件").toString();
String str1a = new String(str1); // <-- refers to a different String 
str1 = str1.intern();
str1a = str1a.intern();
System.out.println(str1a == str1);
String str2 = new StringBuffer("ja").append("va").toString();
String str2a = new String(str2); // <-- refers to a different String 
str2 = str2.intern();
str2a = str2a.intern();
System.out.println(str2a == str2);

出力は(ご想像のとおり)

true
true
于 2015-08-14T01:37:10.767 に答える