3

重複の可能性:
.equals メソッドが 2 つの同じ値オブジェクトで失敗するのはなぜですか?

これは非常に単純ですが、ここでかなり大きなものが欠けていることは明らかです。

Cat cat1 = new Cat("bob");
Cat cat2 = new Cat("bob");
System.out.println(cat1 == cat2); 
//false since these references point to diferent objects
System.out.println(cat1.equals(cat2));
//returns false also??

Cat名前だけの単純なクラスです。

ここで何が起こっているのか、どのように機能しequals()ますか? オブジェクトのすべてのフィールドを比較したという印象を受けました。そうではないようです。

すべてのクラスでオーバーライドする必要がありますか?

4

5 に答える 5

7

はい。

java.lang.Objectとの非常に基本的な実装を提供しequals()ますhashCode()。特に、それらはインスタンスのタイプを反映しません。これは、(1) 恐ろしく遅く、(2) さまざまな理由で比較したくないフィールドを比較する重大なリスクを伴います。平等比較。

equals() と hashCode() を (参照の等価性ではなく==) 値の等価性の比較に実際に役立てたい場合は、両方を独自の型に実装する必要があります。

ただ実装するだけでは十分ではないことに注意してくださいequals()。技術的には「機能」しますが、あらゆる種類の奇妙さにつながる可能性があります。簡単な経験則は、どちらでもない、または両方であり、1 つだけではないということです。そして、彼らは同じ分野で働かなければなりません。equals()2 つのインスタンスが等しい場合、両方を呼び出すとhashCode()同じ値が返される必要があります (hashCode()コントラクトも参照してください)。

toString()問題のオブジェクトの意味のある説明を提供するコードでオーバーライドすることも、通常は良い考えです。厳密に必要というわけではありませんが、デバッガーでこれに頭を悩ませるだけで、その価値を実感できます。(@JonTaylor さん、この非常に便利な関連情報について言及していただきありがとうございます。)

そして、それを呼び出すのは.NETですがGetHashCode()、JavaはhashCode()関数名としてのみ使用します...

于 2012-10-31T19:24:36.220 に答える
4

equalsクラス内でオーバーライドする必要がありますCat。デフォルトの equals は、参照のオブジェクトを比較します。

class Cat {
private String name;

public Cat(String name) {
    this.name = name;
}

@Override
public boolean equals(Object obj) {
    if (obj == null)
        return false;
    if (!(obj instanceof Cat))
        return false;
    Cat c = (Cat) obj;
    return this.name == null ? false : this.name.equals(c.name);
}

@Override
public int hashCode() {
    return this.name == null ? 31 : this.name.hashCode();
}

@Override
public String toString() {
    return "Cat Name :" + name;
}
}

参考文献

于 2012-10-31T19:24:28.353 に答える
0

これは、== 比較参照とjava.lang.Object.equals()変換が、あなたの場合this==oと同じように返されるためです。==

上記の場合、new演算子を使用して2つの異なるオブジェクトを作成しているため、どちらもfalseを返します。

.equals()期待どおりに作業したい場合は、クラスでをオーバーライドequals()しますCat

于 2012-10-31T19:32:00.743 に答える
0

[JavaDoc]から

クラスObjectのequalsメソッドは、オブジェクトに対して可能な限り最も識別力のある同値関係を実装します。つまり、null以外の参照値xおよびyの場合、このメソッドは、xとyが同じオブジェクトを参照している場合にのみtrueを返します(x == yの値はtrueです)。

equals()メソッドをオーバーライドしないと、オブジェクトは異なります。

 System.out.println(cat1.equals(cat2)); // is false
于 2012-10-31T19:33:14.593 に答える
0

equals()java.lang.object によって提供される は、簡単に言えば、オブジェクトの一意の識別子を比較します。完全に正確ではありませんが、メモリの場所と考えることができます。メモリ内の同じオブジェクトへの参照)

Cat クラスに独自の equals() メソッドを実装する必要があります。

class Cat
{  
   String name;

   @Override
   public boolean equals(Cat other)
   {
      if (this.name.equals(other.name))
          return true;
      return false;
   }
}

hashCode()これが宿題などの非常に基本的なアプリケーションでない限り、オーバーライドすることも賢明です。またtoString()、オーバーライドにも役立ちます。

http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html

于 2012-10-31T19:28:29.487 に答える