hashCodeとequalsの関係

1055 ワード

Objectクラスで定義されたいくつかのhashCodeの規則は次のとおりです.1.同じアプリケーションでは、オブジェクトのhashCode関数がequals関数に変更されていない場合、何度呼び出されても同じ整数を返さなければなりません.2.両方のオブジェクトがequals関数の呼び出しが等しい場合、hashCode関数の呼び出しは必ず同じ整数を返します.3.2つのオブジェクトがequals関数を呼び出すのが等しくない場合、hashCode関数を呼び出すには、必ずしも異なる整数を返す必要はありません.我々は,equalsとhashCode関数を書き換える際には,上記の3つの約束を必ず守り,equalsを書き換えると同時にhashCodeの実現を書き換えることで,正しい結果が得られることを保証する.以前は本当に気づかなかったようで、equalsになって、本当にeqaulsを得ました.hashMapでは同じように対応する値が得られます.しかし、例の中で、私はこのように使うことができないと感じて、みんなの観点はどうですか?
Point p1 = new Point(1, 2);
Point p2 = new Point(1, 2);
Hashtable<Point, String> ht = new Hashtable<Point, String>();
ht.put(p1, "value");
System.out.println(p1.equals(p2));
System.out.println(ht.get(p2));

上記のPointクラスによって実現され、p 1とp 2は等しく、最初の文は正常にtrueを出力する.しかし,2番目の文が出力する値はnullであり,所望の「value」は得られなかった.この問題の根本的な原因は、Pointクラスがequals関数を書き換え、等しい概念を変更したが、hashCode関数を変更しなかったため、2つの等しい関数が異なるhashCodeを持ち、ObjectクラスのhashCodeに関する約束の第2点に違反し、誤った結果を返したことである.equalsの詳細は、次のとおりです.http://lionheart.iteye.com/blog/135077