【Java】ObjectクラスのhashCodeメソッドは何に使われているのか

equalsのためではなかった
3
ぜろゆ🍥 @zer0_u

ObjectクラスのhashCodeの戻り値(ハッシュ値)、OCJPの問題集だと「オブジェクトを検索する際のパフォーマンス向上させる目的で使われる」ってあるけどほんと?

2017-08-17 10:15:27
ぜろゆ🍥 @zer0_u

javadoc見ると「ハッシュ表の利点のためにサポートされます」てあるのがこのパフォーマンス向上にかかってくるのかな docs.oracle.com/javase/jp/8/do…

2017-08-17 10:16:13
なぎせ ゆうき @nagise

@zer0_u 標準APIの範疇で言えばHashMapなどで用いられるハッシュ値ですからねえ……

2017-08-17 10:16:31
ぜろゆ🍥 @zer0_u

@nagise equalsのための値だと思ってました…

2017-08-17 10:17:11
なぎせ ゆうき @nagise

@zer0_u ハッシュ値が等しいからといってequalsが等しいわけでもないですからね。 古典的なハッシュテーブルのアルゴリズムで必要なハッシュ関数がObject#hashCode()ですよ、というのがJavaの設計かと

2017-08-17 10:19:18
ぜろゆ🍥 @zer0_u

ハッシュテーブルのための値だから、定義?注意点?に「equalsメソッドに従って2つのオブジェクトが等しい場合は」って出てくるのか〜 equalsのための値だと思ってたからなんか変だなーって気になってたんだよ

2017-08-17 10:26:04
なぎせ ゆうき @nagise

@zer0_u HashMapとかではまずハッシュ値で走査して候補を絞って、その後equalsで特定する動きをしますね。 32bit の intの範囲でhash値を用意する以上、ハッシュ値の衝突は避けえません

2017-08-17 10:28:47
ひしだま @hishidama

JavaのObjectクラスにhashCode()があるのは、昔から違和感があるんだよなー。HashMapのキーにする為なら、その為のインターフェースを用意すべきだったんじゃ…。

2017-08-17 10:24:02
なぎせ ゆうき @nagise

まあ1.0でObjectにhashCode()を用意してしまったからには、それを取り除いて改定というのはやりにくかったのかもなあとは思いますね

2017-08-17 10:26:17
ひしだま @hishidama

HashMapがどういう作りになっているかは、昔調べたことがあるなー。ne.jp/asahi/hishidam… Java8でも同じかどうかは確認してない^^;

2017-08-17 10:30:42
なぎせ ゆうき @nagise

@hishidama @megascus へー。これは抑えてなかった。 docs.oracle.com/javase/jp/8/do… javadocでは「これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されます」とありますね。変換が乱数ということか

2017-08-17 10:37:56
ひしだま @hishidama

ということは、hashCodeの値をDBに保存してたりするとヤバいわけか…そんなことをしているシステムは無いと思うけど^^;

2017-08-17 10:39:43
うらがみ⛄ @backpaper0

@bufferings @irof ObjectにhashCodeとequalsがあるの、マジ設計ミスだと思う(色んなアレで仕方がなかったのかもしれないけれど)

2017-04-06 23:41:05

他の言語ではどうなっているか

ねの @neno_n0

@togetter_jp これ、C#(というか .NET) でもそうで、GetHashCodeの実装がいいかげん(return 1固定とか)だとDictionaryの検索パフォーマンスが落ちる、とか

2017-08-17 10:54:17
ねの @neno_n0

@togetter_jp インスタンス生成してからオブジェクトの内部状態によってGetHashCodeの値が変わるような実装にしていると、Dictionaryから取りだせなくなるからダメって聞いたからそれは注意してるけど、実際試したことはない

2017-08-17 10:55:54