5

重複の可能性:
オブジェクトのハッシュコードとは

Employeeインスタンス変数と対応するsetter/getterメソッドのid、firstName、lastName、emailを持つと呼ばれるオブジェクトを作成するとします。コレクションオブジェクトに格納されているときにオブジェクトをオーバーライドしhashCode()ない場合、どのように計算されますか?hashCode()Employee

4

5 に答える 5

28

hashcode()をオーバーライドしない場合、Objectクラスのデフォルトの実装がコレクションによって使用されます。この実装は、equals()メソッドに従って等しい場合でも、オブジェクトごとに異なる値を提供します。

HashSet、HashMap、HashTableなどの一部のコレクションは、ハッシュコードを使用してデータを格納し、取得します。hashcode()とequals()を一貫した方法で実装しないと、正しく機能しません。

編集:

Javadocによると、Object.hashcode()は「通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法はJava(TM)プログラミング言語では必要ありません」。したがって、特定の実装に依存しないことをお勧めします。実装が実際に行うことについては、同様の質問に対するこの回答を参照してください。

于 2013-01-30T16:22:40.930 に答える
9

ドキュメントから:

合理的に実用的である限り、クラスObjectによって定義されたhashCodeメソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法はJavaTMプログラミング言語では必要ありません。)

したがって、基本的にMap / Set / somethingThatRequiresHashCodeに格納する場合、JVMはそのインスタンスの内部メモリアドレスを使用してhashCodeを計算し、(ハッシュ関数が何かを保証するのと同じように)それぞれの個別のインスタンスが持つことを保証します一意のhashCode。

これは、equalsとhashCodeに関するオブジェクトコントラクトのために特に重要です。理由は次のとおりです。

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

equalsをオーバーライドしない場合、hashCodeの背後にあるロジックと一致する2つの参照の内部アドレスが比較されます。

質問がより関連している場合:JVMはインスタンス内の値を調べて、同等性を判断し、ハッシュコードを計算しますか?次の場合、答えは単に「いいえ」です。

MyObject a = new MyObject("a", 123,"something");
MyObject b = new MyObject("a", 123,"something");

ab異なるハッシュコードがあります。

于 2013-01-30T16:21:14.880 に答える
2

効果的なJava2ndEditionから

項目9:等しいをオーバーライドするときは、常にhashCodeをオーバーライドします

バグの一般的な原因は、hashCodeメソッドのオーバーライドの失敗です。equalsをオーバーライドするすべてのクラスでhashCodeをオーバーライドする必要があります。そうしないと、Object.hashCodeの一般的なコントラクトに違反することになり、HashMap、HashSet、Hashtableを含むすべてのハッシュベースのコレクションと組み合わせてクラスが正しく機能しなくなります。

その章を読むことをお勧めします。あなたが学ぶことができる多くの例があります、そうしないとどうなるでしょう。

于 2013-01-30T16:24:47.070 に答える
1

HashSetコレクションによって異なります。適切に機能するために要素hashCodeに依存するようなコレクションを除いて、ほとんどのコレクションは要素のhashCodeがオーバーライドされていなくても機能するはず です。コレクションのhashCodeは通常、要素のhashCodeに依存していることに注意してください。

このコレクションのハッシュコード値を返します。Collectionインターフェースは、Object.hashCodeメソッドの一般契約に規定を追加しませんが、プログラマーは、Object.equalsメソッドをオーバーライドするクラスは、Object.hashCodeメソッドもオーバーライドする必要があることに注意してください。 .hashCodeメソッド。特に、c1.equals(c2)は、c1.hashCode()== c2.hashCode()を意味します。

参照:http ://docs.oracle.com/javase/6/docs/api/java/util/Collection.html#hashCode%28%29

于 2013-01-30T16:41:52.733 に答える
0
**type of field**             **hash code formula**

boolean                       fieldHash = f ? 0 : 1

any integer type except long  fieldHash = (int) f

long                          fieldHash = (int) (f ^ (f >>> 32))

float                         fieldHash = Float.floatToIntBits( f )

double                        int v=Double.doubleToLongBits(f)

fieldHash                     (int) (v ^ (v >>> 32))

any Object reference          fieldHash = f.hashCode()

hashCodeカスタムタイプを作成する場合は、現在のインスタンスの状態を最もよく表す適切な実装を作成する責任があります。

http://content.hccfl.edu/pollock/AJava/HashCode.htm

于 2013-01-30T16:28:27.433 に答える