2012-01-01 24 views
2

意味のある有益なequals()メソッドを持つオブジェクト(つまり、Bean)を持っていても、補完的なものがない場合は、最悪の場合の結果(実際のシナリオはここです)hashCode()方法?ほとんどのAPIは、コレクションを維持するためにequals()compareTo()メソッドを使用しているようです。 hashCode()が最も重要なのはいつですか?等価オブジェクト=等価ハッシュコードの結果、

+2

ハッシュテーブルでは? – helloworld922

+1

この投稿は、それをうまく説明: http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java – srchulo

答えて

6

最悪の場合の結果はハッシュテーブルを動作しないことがあります。ここで

public class StringWrapper { 
    private String value; 
    ... 
    public boolean equals(Object other) { 
     // two objects are equal if their respective values are equal ... using `equals`. 
    } 
    // No hashcode override. 
} 

我々は対等/ハッシュコード契約の必要な不変量の一つに従わないクラスを持つクラスを持っています。たとえば、あなたがこのように単純なクラスを持っていることを前提としています。具体的には、2つのインスタンスは等しいが、異なるハッシュコードを持つ。あなたがHashSetのにこのクラスの2つの異なるインスタンスを追加すると

、あなたは異なるハッシュチェーンのセットで両方インスタンス...で終わることがあります。セットからオブジェクトを削除するときや、セットにオブジェクトが含まれているかどうかを調べるときなど、同様の異常が発生します。

(別のハッシュコードがあるにもかかわらず、2つのインスタンスが同じハッシュチェーンになることがありますが、ハッシュテーブルに他の無関係なオブジェクトが追加されると運が変わることがあります。サイズを変更。サイズ変更は、異なるハッシュコードを持つエントリが異なるハッシュチェーンに再配布することが発生しやすくなります。)


だから私は思ったんだけど...ときハッシュコードは、最も重要なのですか?

常に重要です。

また別の言い方をすれば、クラスのインスタンスがであることを100%確実に知っている場合は、がハッシュテーブルで使用されることは絶対にありません。 (そして、私はあなたが、クラスのすべてのコピーを削除しない限り、あなたが、それを知ることができるのか分からない。そして、それは議論の余地全体の問題をレンダリング!)


UPDATEケースを述べ@supercat

まともなハッシュコードを書くことはできません。

hashcode()メソッドを半分書けないと良い理由がある場合は、それを無効にしてUnsupportedOperationExceptionなどをスローすることを推奨します。そうすれば、誰かがハッシュテーブルにインスタンスを入れようとすると、不思議なパフォーマンスのブラックホールではなく、高速で失敗することになります。 (定数のハッシュコードを返すことをお勧めしません)

オブジェクトが本質的にであり、ハッシュキーを変更した場合に発生する悪影響を避けたい場合には、そのハッシュコードが変更されます。

+0

または、同じではないインスタンスで検索が失敗します。 –

+0

@ダニエルフィッシャー - 私はすでに言及しました。 –

+0

読み書き中に編集したページを更新しませんでした。 –

1

これらのいずれかに関心を持つ場合は、両方を実装/上書きする必要があります。具体的には、Why do I need to override the equals and hashCode methods in Java?を参照してください。これらの実装が適切な関連する実装で実装されていない場合に起こりうることも含まれます。

さらに、そこanother answerから:

あなたはイコール()をオーバーライドするすべてのクラスでのhashCode()をオーバーライドする必要があります。 これを行わないと、Object.hashCode()の汎用規約 に違反し、 は、 HashMap、HashSet、およびHashtableを含むすべてのハッシュベースのコレクションと正しく機能しません。効果的なJavaから

、ジョシュア・ブロック

0

によるこの方法は、このメソッドが呼び出されるオブジェクトのハッシュコード値を返します。このメソッドは、ハッシュコード値を整数として返し、Hashtable、HashMap、HashSetなどのハッシュベースのコレクションクラスのためにサポートされています。このメソッドは、equalsメソッドをオーバーライドするすべてのクラスでオーバーライドする必要があります。

reference

+0

downvoteの理由を与える気にしてください???? –

+2

私はdownvoteしませんでしたが、あなたの答えは明らかに質問された質問に答えることはありません。彼はあなたがこのメソッドをオーバーライドしなければならない理由を知りたいと思っています。 –

+0

私はどちらかをdownvoteしませんでしたが....これは質問に答える---質問は何ですか?ハッシュコードは重要でした。 – jayunit100