29
class strb
{

    static public void main(String...string)
    {
         StringBuilder s1 = new StringBuilder("Test");
         StringBuilder s2 = new StringBuilder("Test");

         System.out.println(s1);
         System.out.println(s2);
         System.out.println(s1==s2);
         System.out.println(s1.equals(s2)); //Line 1
         System.out.println(s1.toString()==s2.toString()); //Line 2
         if(s1.toString()==s2.toString())System.out.println("True"); //Line 3
    }

}

そして、出力は

Test
Test
false
false

.equals について簡単な質問があります。

オブジェクトの内容に関係なく、.equals両方のオブジェクト参照が同じオブジェクトを指している場合にのみ true を返しますか?


EDIT:今、私はについての部分を理解しています.equalsが、なぜ2行目と3行目も返されないのtrueですか?

編集==参照変数のアドレスを見て、s1とs2を等しくすることはできないと信じています。私の仮定が正しくない場合は修正してください

4

8 に答える 8

61

はい、StringBuilder does not override Object's .equals() functionこれは、2 つのオブジェクト参照が同じではなく、結果が false であることを意味します。

の場合StringBuilder、使用できますs1.toString().equals(s2.toString())

==編集のために、 2 つの異なる String オブジェクトで演算子を呼び出しています。オブジェクトが異なるため、==演算子は false を返します。文字列を比較するには、String.equals()またはを使用する必要がありますString.equalsIgnoreCase()

それはあなたが以前抱えていたのと同じ問題です

于 2013-09-02T04:37:44.223 に答える
4

クラスはオーバーライドされたメソッドStringBuilderを提供しません。equals()そのため、そのメソッドが のインスタンスで呼び出されると、メソッドStringBuilderObjectクラス実装が実行されStringBuilder extends Objectます。

そのためのソースコードは

public boolean equals(Object obj) {
    return (this == obj);
}

これは単に参照の等価性を比較します。

于 2013-09-02T04:39:36.630 に答える
3

クラスのデフォルトの実装は.equals、あなたが言及したとおりです。Object

他のクラスは、この動作をオーバーライドできます。 StringBuilderそれらの1つではありません。

String はその 1 つであり、両方のオブジェクトの String 表現が同じ文字シーケンスになるようにオーバーライドします。 文字列 API

問題の特定のオブジェクトのドキュメントを参照してください。

于 2013-09-02T04:37:38.953 に答える
1

StringBuilderequals()クラスには、クラスのようなメソッドの実装がありませんString

そのため、デフォルトの Object クラス機能が実行されますが、この場合もアドレスの等価性のみがチェックされますが、これは同じではありません。したがって、false と出力されます。

注1==オブジェクトにも演算子を使用できますが、両方のオブジェクトのアドレスが同じかどうかを確認するだけです。

注 2 :==演算子は、文字列定数プールで作成された 2 つの String オブジェクトを比較して、実際に文字列定数プールで新しいオブジェクトを作成しているかどうかを確認するのに適切な役割を果たします。

于 2013-12-10T12:12:07.443 に答える
1

StringBuilderStringBufferクラスのequals関数をオーバーライドしませんが、文字Object列はequalsメソッドをオーバーライドします。の機能Objectはこれです

public boolean equals(Object obj) {
    return (this == obj);
    }

このようにコードを書くことができます。

System.out.println(s1.toString() == s2.toString());
System.out.println(s1.toString().equals(s2.toString()));
于 2013-09-02T04:51:13.293 に答える
0

上記の両方の回答に同意しましたが、実際にできる内容を比較することは注目に値します。

System.out.println(s1.toString().equals(s2.toString())); //Line 1
于 2013-09-02T04:39:15.633 に答える