プロが教えるわが家の防犯対策術!

Java開発時に気をつけることとしてObject.equals()をオーバーライドする時は
Object.hashCode()もオーバーライドする。という規則がありますが、
最も一般的な定義例を教えて下さい。

A 回答 (3件)

「equals(Object) メソッドで 2 つのオブジェクトが等価とされた場合、


どちらのオブジェクトで hashCode メソッドを呼び出しても結果は
同じ整数値にならなければならない」

を満たせばいい訳で、その逆は要求されていません。

従って

・「2つのオブジェクト(a,b)のhashCode メソッドの結果が同じ時、
a.equals(b)がtrueになる」

・「equals(Object) メソッドで 2 つのオブジェクトが非等価とされた場合、
どちらのオブジェクトで hashCode メソッドを呼び出しても結果は
違う整数値にならなければならない」

ということは要求されてはいません。

ということは、最も簡単なのは、「常に同じ値を返す」ことです。

ただ、それでは効率がよくないので、オブジェクト同士を識別する
もの(社員番号等)を返したりします。
社員番号のようなものをそのまま返すとメモリを使いすぎると思えば、
社員番号を適当な数で割った余りを返したりもします。
(社員番号の体系等によります)


hashCode()の返値はMapのように、キーによってデータを管理するものが、
データの格納場所を特定するのに使います。

キーによってデータを取り出すためには、リストを上から順に探したのでは
効率がよくないですね。かといってバイナリサーチをするためには、
リストがキーによってソートされていなければなりません。

そこで、予め格納する場所を用意しておいて、なるべく格納場所が散らばるように
して格納します。この時、格納場所を決定するのがhashCode()の返値です。

データを取り出す時は、そのハッシュコードから格納場所を特定し、取り出します。
(全部の格納場所を順に探したのでは意味がない)

一般に、格納場所には複数のデータを格納でき、1つの格納場所の中を順次検索します。
もし、入りきらなくなったら、次回からは別の場所に格納します
(元の場所には、続きがあると印を付けておく)。

全部のデータが同じハッシュコードだと、リストを頭から検索するのと同じに
なってしまい、効率が悪い訳です(1つの格納場所内は順次検索のため)。


下手な説明で申し訳ありませんが、これでどうでしょうか?

補足が必要なら、お答えします(知っている範囲で)。
    • good
    • 0

「最も一般的」ではないと思いますが、「定義例」であれば


「Javaパフォーマンステクニック」という本の「最適化23」のところに
Stringクラスを拡張して、equals()とhashCode()をオーバーライドする例が
載っています。
    • good
    • 0

>最も一般的な定義例を教えて下さい。


「どうオーバーライドすればいいのか」、そのガイドラインを聞いているのですね?
-----------------------------
Java1.4のAPIドキュメントの

■Object#hashCode()に
「equals(Object) メソッドで 2 つのオブジェクトが等価とされた場合、どちらのオブジェクトで hashCode メソッドを呼び出しても結果は同じ整数値にならなければならない」

■Object#equals()に
「通常、このメソッドをオーバーライドする場合は、hashCode メソッドを常にオーバーライドして、「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という hashCode メソッドの汎用規約に従う必要があることに留意してください」

と書いてありますね…。
この方針に矛盾しないように
hashCode()もオーバーライドすればいいんじゃない?
(こういうこと聞いてるのではないのかな?)

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/api/java …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!