10689


hashCode()を使って、特定のインターフェースを継承した実装クラスを特定するという実装について、疑問を抱きました。

hashCode() ”これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されます”  
とあるので、Mapとして保持し、外部で記憶したhashCodeからインスタンスを引っ張りだす、という事は可能でしょうか？  
hashCode()はintなので、わりとすぐ上限が来てしまうのかなとも思います。

アドレス計算なのであれば、そのアドレスが上書きされた場合には衝突するでしょうが、  
springフレームワークの場合、一つのインスタンスからインジェクションしたインスタンスはまとめてインスタンス化されるので、アドレスの重複もあり得ないのでは?GCされない限りハッシュ値がコンフリクトすることもないのかな、とも思います。

これらの推測がすでに矛盾してしまっている(相当量のメモリを積み、相当量のインスタンスを生成した場合、hash値は絶対に衝突しないのか？)ので、ご存じの方がいらっしゃいましたら教えてください。


CC BY-SA 3.0
2015-05-27T06:38:53.243
10663
2015-05-27T11:49:34.973
8396
question
java spring
JAVA Object.hashCode()について


Object.hashCode()は

  * ハッシュ値が等しい→等しい可能性がある(equals==true or false)
  * ハッシュ値が異なる→必ず異なる(equals==false)

だけを満たせばよいので

`public int hashCode() { return 0; }`

という実装も正しいです.  
(必ずハッシュ値が衝突するので、性能はとても悪くなります)  
<http://www.ibm.com/developerworks/jp/java/library/j-jtp05273/>

そのため、hashCode()の値からインスタンスを直接引き当てる実装は作れません.  
無理に作るとすれば、ハッシュテーブルの連鎖法に似た実装をすることになると思います.

<http://d.hatena.ne.jp/chiheisen/20120318/1332071962>  
(回答を書くのに参考にしました)


CC BY-SA 3.0
2015-05-27T11:49:34.973
10689
2015-05-27T11:49:34.973
9796
10663
answer