0

StringBuffer は文字列を内部でどのように処理しますか? 以下の例を実行してみましたが、「文字列が等しくありません」という答えが得られました。

私が知っていることから、両方の文字列が同じ値を持つ場合、equals() は true を返すということです。では、この場合、何が起こっているのでしょうか?

class StringBufferTest {

public static void main(String[] args) {
    String newString = "HelloWorld";
    StringBuffer buffer = new StringBuffer(newString);

    if (buffer.equals(newString)) {
        System.out.println("Strings are equal");
    } else {
        System.out.println("String are unequal");
    }

  }
}
4

5 に答える 5

8

のインスタンスを のインスタンスと比較していますStringBufferString、異なる型であるために望ましい結果が得られません。プレーンをオーバーライドしないStringBufferため、プレーンを使用することに注意してください(JavaDocによって実際にオーバーライドされることに注意してください)。変数のオブジェクト参照ではなく、の内容を比較する必要があります。Object#equalsStringBufferString#equalsStringbufferbuffer

if (buffer.toString().equals(newString)) {
    //...
}

また、Java 5 からは、StringBuilderの代わりに使用した方がよいでしょうStringBuffer。これに関する詳細情報: StringBuilder と StringBuffer の違い

于 2013-07-09T16:32:44.127 に答える
2

equals(比較される 2 つのオブジェクトが同じ型でない場合、false を返します。含まれている文字列に関係なく、StringBuffer型が異なりString、比較が真になることはありません。

buffer.toString.equals(newString)動作するはずです。

于 2013-07-09T16:33:15.057 に答える
0

比較しています:

if (buffer.equals(newString)) 

これは、実際には StringBuffer オブジェクト型を String オブジェクト型と比較しています。それは明らかにfalseを返します。

メソッドから true を返すにはequals、同じタイプのオブジェクトを比較する必要があります。

公式ドキュメントによると

public boolean equals(Object obj)
他のオブジェクトがこのオブジェクトと「等しい」かどうかを示します。
equals メソッドは、null 以外のオブジェクト参照に対して等価関係を実装します。

これは再帰的です: null 以外の参照値 x に対して、x.equals(x) は true を返す必要があります。
これは対称的です: null 以外の参照値 x と y の場合、y.equals(x) が true を返す場合に限り、x.equals(y) は true を返す必要があります。
これは推移的です: null 以外の参照値 x、y、および z に対して、x.equals(y) が true を返し、y.equals(z) が true を返す場合、x.equals(z) は true を返す必要があります。
一貫性があります。null 以外の参照値 x および y に対して、x.equals(y) の複数の呼び出しは一貫して true を返すか、一貫して false を返します。ただし、オブジェクトの equals 比較で使用される情報が変更されていない場合に限ります。
null 以外の参照値 x の場合、x.equals(null) は false を返す必要があります。

于 2013-07-09T16:33:17.150 に答える
0

オブジェクトとオブジェクトを等しくすることはできません。次を使用してください:StringStringBuffer

buffer.toString().equals(newString)

RedSafeではないStringBuilderため、より良い使用StringBuffer

于 2013-07-09T16:49:59.677 に答える