1

「ここ」の印刷行に届かないのはなぜですか?言い換えれば、オーバーライドされた equals を使用しないのはなぜですか? 前もって感謝します

import java.util.*;
class NumberClass extends Object{
    private int number;

    public NumberClass(int n){
        number=n;

    }
    @Override
    public boolean equals(Object other){
        System.out.println("here");
        return false;
    }
    @Override
    public String toString(){

        return number+"";
    }   
}
public class HelloWorld {
    public static void main(String[] args) {

        Set <NumberClass> set= new HashSet<NumberClass>();
        set.add(new NumberClass(0));
        set.add(new NumberClass(0));
        System.out.println(set);
    }

}
4

2 に答える 2

4

これはHashSet、ハッシュ コードを使用して、オブジェクトが既にセット内にあるかどうかをテストしequals、衝突がある場合にのみ使用するためです。オブジェクトのデフォルトのハッシュ コードは内部 ID であるため、2 つのオブジェクトが等しいからといって、それらが同じハッシュ コードを持っているとは限りません。この場合、明らかに衝突がなかったため、HashSetを呼び出す必要はありませんでしたequals

hashCodeこれが、オーバーライドするときに常にオーバーライドする必要がある理由ですequals。このトピックの詳細については、この記事を参照してください。hashCodeであるオブジェクトに対して等しいハッシュ値を返すメソッドを作成する必要がありequalsます。例えば:

public int hashCode() {
    return number;
}

の一般的な要件hashCodeは、条件を満たすオブジェクトがequals()同じハッシュ コードを返す必要があるということです。equals()テストに失敗したオブジェクトのハッシュ コードが異なる必要はないことに注意してください。定数を返す場合 (Jayamohan が示唆するように)、それはhashCode契約を満たします。ただし、これでは を使用する利点が完全に失わHashSetれ、単純な を使用することもできますArrayList

于 2013-02-15T04:26:07.710 に答える
1

物件を見比べながら、

  • equalshashCodeが異なる場合、メソッドは呼び出されません
  • hashCode(obj1 == obj2) の場合、メソッドは呼び出されません

したがって、あなたの場合、hashCode メソッドをオーバーライドしていないため、ハッシュ コードが異なるため、equals は呼び出されません。以下のように hashCode メソッドをオーバーライドしてみてください。equals メソッドが呼び出されます。

@Override
public int hashCode() {
    return 1;
}

JavaのObject.equals APIは次のように述べています

通常、このメソッドがオーバーライドされるときは常に、hashCode メソッドをオーバーライドする必要があることに注意してください。これは、等しいオブジェクトには等しいハッシュ コードが必要であるという、hashCode メソッドの一般的な契約を維持するためです。

したがってhashCode、equals メソッドをオーバーライドするときは忘れずにオーバーライドしてください。

于 2013-02-15T04:29:44.980 に答える