No.3ベストアンサー
- 回答日時:
「equals(Object) メソッドで 2 つのオブジェクトが等価とされた場合、
どちらのオブジェクトで hashCode メソッドを呼び出しても結果は
同じ整数値にならなければならない」
を満たせばいい訳で、その逆は要求されていません。
従って
・「2つのオブジェクト(a,b)のhashCode メソッドの結果が同じ時、
a.equals(b)がtrueになる」
・「equals(Object) メソッドで 2 つのオブジェクトが非等価とされた場合、
どちらのオブジェクトで hashCode メソッドを呼び出しても結果は
違う整数値にならなければならない」
ということは要求されてはいません。
ということは、最も簡単なのは、「常に同じ値を返す」ことです。
ただ、それでは効率がよくないので、オブジェクト同士を識別する
もの(社員番号等)を返したりします。
社員番号のようなものをそのまま返すとメモリを使いすぎると思えば、
社員番号を適当な数で割った余りを返したりもします。
(社員番号の体系等によります)
hashCode()の返値はMapのように、キーによってデータを管理するものが、
データの格納場所を特定するのに使います。
キーによってデータを取り出すためには、リストを上から順に探したのでは
効率がよくないですね。かといってバイナリサーチをするためには、
リストがキーによってソートされていなければなりません。
そこで、予め格納する場所を用意しておいて、なるべく格納場所が散らばるように
して格納します。この時、格納場所を決定するのがhashCode()の返値です。
データを取り出す時は、そのハッシュコードから格納場所を特定し、取り出します。
(全部の格納場所を順に探したのでは意味がない)
一般に、格納場所には複数のデータを格納でき、1つの格納場所の中を順次検索します。
もし、入りきらなくなったら、次回からは別の場所に格納します
(元の場所には、続きがあると印を付けておく)。
全部のデータが同じハッシュコードだと、リストを頭から検索するのと同じに
なってしまい、効率が悪い訳です(1つの格納場所内は順次検索のため)。
下手な説明で申し訳ありませんが、これでどうでしょうか?
補足が必要なら、お答えします(知っている範囲で)。
No.2
- 回答日時:
「最も一般的」ではないと思いますが、「定義例」であれば
「Javaパフォーマンステクニック」という本の「最適化23」のところに
Stringクラスを拡張して、equals()とhashCode()をオーバーライドする例が
載っています。
No.1
- 回答日時:
>最も一般的な定義例を教えて下さい。
「どうオーバーライドすればいいのか」、そのガイドラインを聞いているのですね?
-----------------------------
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 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Visual Basic : ImageListの画像がそろったときにメッセージを表示 1 2023/07/20 13:53
- Java JAVAの1つの正規表現で上記Textすべてと合致する正規表現を教えてください。 4 2022/11/06 08:46
- その他(ゲーム) マイクラサーバーについて マインクラフト(minecraft)で中規模〜大規模な24時間のJavaサ 1 2022/04/03 16:48
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- オンラインゲーム とても急いでいます。Minecraft Java版についてです。 MinecraftのJava版でマ 1 2023/03/15 21:19
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/02/10 11:41
- IT・エンジニアリング IT開発、ソフトウェア開発、アプリ開発において、要件定義は受注の前か、後か? 見積額に含むか否か? 1 2022/06/20 19:02
- C言語・C++・C# C#の基本文法が詳しく書かれている教科書的な本ありますか 2 2023/02/11 03:48
- Java mac mini 2009 でのmac OS における Java の入れ替えについて 1 2022/12/27 19:23
- その他(コンピューター・テクノロジー) 「プロトコル」の定義について 5 2023/04/16 13:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでの[]
-
VB.netでメソッドからコントロ...
-
サーブレットコンテキストの意...
-
Visual BasicでJavaアプレット...
-
VBスクリプトでテキストファイ...
-
VB.NETでのnothing の意義について
-
エクセルVBA 画像を貼り付ける...
-
ピクチャーボックスに点を打つ...
-
Dispose()は、どんな時に使うの...
-
Excel VBA 定数にオブジェクト...
-
C#で親にイベントを投げる方法
-
画像ファイルをリクエストパラ...
-
C++/CLIでの画像情報(RGB)の取得
-
String型からlong型への変換は...
-
Objectクラスのオブジェクトを...
-
mkdirsでフォルダが作成されない
-
C#のクラスで値渡しをする
-
Vba ListViewの行挿入に関して...
-
ArrayListのデバッグ方法について
-
エクセルVBAで、条件に一致する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでの[]
-
C#のクラスで値渡しをする
-
エクセルVBA 画像を貼り付ける...
-
サーブレットコンテキストの意...
-
servletからjspへオブジェクト...
-
VB.NETでのnothing の意義について
-
JSPでのArrayListの表示につい...
-
VB.netでメソッドからコントロ...
-
Vba ListViewの行挿入に関して...
-
Excel VBA 定数にオブジェクト...
-
javaで、、、
-
Dispose()は、どんな時に使うの...
-
エクセルVBA/SpecialCellsで特...
-
getParameter()について
-
C#で親にイベントを投げる方法
-
ピクチャーボックスに点を打つ...
-
GridViewに行追加するには?
-
drawStringの座標について
-
Javaでブラウザ判定
-
vectorの内容をString型に変換...
おすすめ情報