2016-11-07 4 views
-5
private static void v1() { //true 
    String s1 = new String("a") + new String("a"); 
    s1.intern(); 
    String s2 = "aa"; 
    System.out.println("v1: " + (s1 == s2)); 
} 

private static void v2() { //false 
    String s3 = new String("b") + new String("b"); 
    String s4 = "bb"; 
    s3.intern(); 
    System.out.println("v2: " + (s3 == s4)); 
} 

private static void v3() {// false 
    String s5 = new String("cc"); 
    s5.intern(); 
    String s6 = "cc"; 
    System.out.println("v3: " + (s5 == s6)); 
} 

private static void v4() {// false 
    String s7 = new String("dd"); 
    String s8 = "dd"; 
    s7.intern(); 
    System.out.println("v4: " + (s7 == s8)); 
} 

private static void v5() {// true 
    String s9 = new StringBuilder("e").append("e").toString(); 
    s9.intern(); 
    String s10 = "ee"; 
    System.out.println("v5: " + (s9 == s10)); 
} 

private static void v6() {// false 
    String s11 = new StringBuilder("e").append("e").toString(); 
    String s12 = "ee"; 
    s11.intern(); 
    System.out.println("v6: " + (s11 == s12)); 
} 

v1.valueは v2.valueが偽 v3.valueで真である偽 v4.valueが v5.valueがtrue falseである v6.valueはfalseですなぜS1 == s2が(インターンの順序に依存)

どうしますか?
なぜs1 == s2がintern()の順序に依存するのですか?
"s1.intern()"はs1を変更しますか? v1 == v5、v2 == v6ですか? jdk1.6と1.7の間にいくつかの違いがありますか?私は1.7を使用します。





はおそらく、私の問題を正確に記述されていませんか? 実際、「JVMの理解:高度な機能とベストプラクティス」から答えが得られました。 Jdk1.6インターンは、インスタンスを定数プールにコピーし、その参照に戻ります。 1.7はオブジェクトへの定数プールへの参照です。ですから、s1 == s2を使って参照を比較すると、私は真実になります。 この質問は、参考文献の比較について気にするので、あなたのタグ付き「複製」とは関係ありません。

+8

ここではほとんど答えられています:[* Javaで文字列を比較する方法*](http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) –

+0

'intern()'のためにドキュメントを読む必要があります。それはあなたが無視している戻り値を持っています。 – kdgregory

+0

おそらく私の問題は正確に記述されていないでしょうか? 実際に、JVMの理解:高度な機能とベストプラクティスJdk1.6からの回答は、インスタンスを定数プールにコピーしてリファレンスに戻すことです。 1.7はオブジェクトへの定数プールへの参照です。ですから、s1 == s2を使って参照を比較すると、私は真実になります。 この質問は、参考文献の比較について気にするので、あなたのタグ付き「複製」とは関係ありません。 –

答えて

-1

常に文字列をequalsと比較します。 s1 == s2s1.equals(s2)に置き換えてください。最初のものはの参照s1s2を比較するだけですが、後者はの内容を比較しています。 intern方法に関する

は、下部にthisをお読みください。

返しこの文字列と同じ内容を持っていますが、ユニークな文字列のプールからであることが保証された文字列を。文字列をインターンため結果的に

、あなたはs1 = s1.intern();を使用する必要があります。

関連する問題