2017-10-03 3 views
2

IIUC hashCode()が呼び出されたときに両方のオブジェクトが同じ値を返しても、同じ型の2つの異なるオブジェクトをHashSetに格納できます。たとえば、this article「Aa」と「BB」は同じhashcode(2112)を返しますが、明らかにこれらの文字列をHashSetに入れることができ、両方とも "Aa"が "BB"を上書きすることなくSetに含まれます。コレクション内のオブジェクトルックアップを高速化するためにハッシュコードが使用されていますか?

したがって、hashCode()の主な目的は、セット内のインスタンス、または一般的なコレクションを見つけるのを早くすることですか?また、hashCode()の定数を返すと、そのようなオブジェクトを格納しているコレクションのパフォーマンスが低下することになります(JPA context as suggested by this linked article for example内)。

答えて

2

はい。 バケットベースのアルゴリズムの基本は、要素がN個のバケットに均等に分散されるようにすることです(N << |all elements|)。 定数hashCodeを指定すると、すべての要素が同じバケットに強制的に格納され、すべての検索/包含操作が、基本となる(バケット単位の)構造体のみを使用して実行されるようになります。

一般的な説明のためにhttps://en.wikipedia.org/wiki/Hash_table#Choosing_a_hash_functionを参照してください。現在、Java HashSetはちょうどHashMap(Javadocから)(https://en.wikipedia.org/wiki/Hash_table#Sets)によってバックアップされています。

関連する問題