質問
2つの異なるStringBufferオブジェクトでequals()メソッドを使用すると、結果はfalseになりますが、2つの異なるStringオブジェクトでequals()メソッドを使用すると、結果はtrueになります。なぜですか?
String s=new String("434");
String s1=new String("434");
System.out.println(s.equals(s1));//true
StringBuffer s=new StringBuffer("434");
StringBuffer s1=new StringBuffer("434");
System.out.println(s.equals(s1));//false
解決
StringBufferは、equals()をオーバーライドしません。そのため、Object.equals()が呼び出され、オブジェクトのID(メモリアドレス)が比較されます。文字列は等号をオーバーライドし、コンテンツを比較します。
他のヒント
StringBuffer
は Object#equals()
をオーバーライドしないため、 valueではなく reference identity ベースのチェックが発生します。 ベースのチェック。これらの StringBuilder
インスタンスは個別であり、それぞれが異なるメモリ位置を持っているため、ベースの Object#equals()
実装は常にfalseを返します。
Java 6の時点での定義は次のとおりです。
public boolean equals(Object obj) {
return (this == obj);
}
問題を確認しますか
少なくとも私のバージョンのJDK(Sun 1.6)では、StringBufferはequals()メソッドを実装していません。つまり、Objectのequals()メソッドを継承します。これは==
と同じです2つのStringBufferの等価性を本当にテストする場合は、x.toString()。equals(y.toString())を呼び出すことができます
2つのStringBufferオブジェクトの文字列表現を比較する場合は、次のようにします。
StringBuffer sb1 = new StringBuffer("434");
StringBuffer sb2 = new StringBuffer("434");
if (sb1.toString().equals(sb2.toString())) {
// whatever you want to do if they're equal
} else {
// whatever you want to do if they're not
}
それ以外の場合、2つのStringBuffer オブジェクトの内容ではなく、それらの内容を比較しています-つまり、(存在しない)StringBuffer#equalsではなく、Object#equals()を実行しています()。
equalsは、2つのオブジェクトが同じ場合にのみStringBufferオブジェクトでtrueを返します。 StringBuffersを希望どおりに比較するには、これを使用します:
System.out.println(s.toString().equals(s1.toString());
String s.equalsは文字列テーブルを使用して実際の文字列を比較しますが、StringBuffer sb.equalsはequalsメソッドのデフォルト実装を使用し、オブジェクトポインタを比較するだけです。
StringBufferには、オブジェクトクラスからequals()メソッドを継承するequalsメソッドの独自の実装がないため、stringBufferの実際のコンテンツを比較するのではなく、ハッシュ値が比較されます。したがって、equals()メソッドの実装を提供する文字列オブジェクトに明示的にキャストする必要があります。
String
オブジェクトのセマンティクスは、2つのインスタンスが同じ文字シーケンスを含むことが観察された場合、常に同じ文字シーケンスを含み、少なくとも1つは String
オブジェクト自体の観点-プログラムのセマンティクスを変更せずに、文字列の1つへのすべての参照を他の文字列への参照に置き換えます。すべての実用的な目的のために、 String
のインスタンスにカプセル化された情報はターゲットインスタンスに含まれる文字のシーケンスのみであるため、このようなインスタンスは同等と見なされます。
対照的に、 StringBuffer
型の変数は、文字のシーケンスだけでなく、特定のインスタンスの identity もカプセル化します。 2つの変数が同じインスタンスを参照している場合、1つの変数が参照するインスタンスに変更すると、他の変数が参照するインスタンスに影響します(同じインスタンスであるため)。それらが異なるインスタンスを参照する場合、一方が参照するインスタンスを変更しても、他方が参照するインスタンスには影響しません。 Javaの StringBuffer
が equals
をオーバーライドしないという決定は、怠ofの結果ではなく、 StringBuffer
オブジェクトが意味のあるアイデンティティ、およびばらばらのインスタンスは常に異なるアイデンティティを持っています。