0
class A{

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

public class SampleClass {

    public static void main(String[] args){
        Map map = new HashMap();

        map.put(new A(), "A");
        map.put(new A(), "B");

        System.out.println(map.size());

        System.out.println(new A().hashCode());
        System.out.println(new A().hashCode());
    }
}

出力:-

2

10

10

なぜ2???. 同じ整数を返す hashCode メソッドを実装している場合。サイズは1であるべきではありませんか???

4

2 に答える 2

9

をオーバーライドequals(Object)していないため、同等とは比較されません。

2 つのオブジェクトが同じハッシュ コードを持っているからHashMapといって、それらが同じであると仮定するわけではありません

で2 つのAオブジェクトを等しいものとして扱うにはHashMap、 をオーバーライドequals(Object)して、一方を他方と等しいAものとして定義する必要があります。A

于 2012-07-07T19:28:07.663 に答える
3

http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode ()から

hashCode の一般的な契約は次のとおりです。

  • Java アプリケーションの実行中に同じオブジェクトに対して複数回呼び出された場合は常に、オブジェクトの equals 比較で使用される情報が変更されていない限り、hashCode メソッドは一貫して同じ整数を返す必要があります。この整数は、あるアプリケーションの実行から同じアプリケーションの別の実行まで一貫性を保つ必要はありません。

  • equals(Object) メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、同じ整数結果が生成される必要があります。

  • equals(java.lang.Object) メソッドに従って 2 つのオブジェクトが等しくない場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、異なる整数結果が生成される必要はありません。 ただし、プログラマーは、等しくないオブジェクトに対して個別の整数結果を生成すると、ハッシュテーブルのパフォーマンスが向上する可能性があることに注意する必要があります。

したがって、2 つのオブジェクトが等しいかどうかを知るには、Louis が指摘したように、equals が最適です。ハッシュコードは、ハッシュベースのコレクション実装が与えられた場合に、オブジェクトをどこにどのように格納するかのみを示します。

于 2012-07-07T19:32:48.950 に答える