ハッシュ関数のハッシュ キーのリストが既知で不変の場合、完全なハッシュ関数を生成できます。JavaのEnumは、既知の不変要素のリストです。したがって、 EnumMapを完全なハッシュとして実装できるはずです。これは現在 (1.7) Java で行われていますか?
4 に答える
いいえ EnumMap
、ハッシュは使用しません。enum
序数値を値型の配列へのインデックスとして使用します。
参照:
- http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/EnumMap.java#EnumMap.getKeyUniverse%28java.lang.Class%29 . (このリンクが壊れている場合は、Google で「java.util.EnumMap ソース」を検索してください。)
EnumMap
データに対して内部的にHashMap
ハッシュを使用するようなものではありません。はと のペアを格納するために使用されます(宣言中のの位置は序数値として知られています) をorデータに内部的に使用します。 Enum.ordinalメソッドは、指定された の取得に使用されます。put
get
Array
<K, V>
K
Enumeration constant
ordinal value
Enumeration constant
Enum
put
get
ordinal value
Enumeration constant
言い換えると、EnumMap
はハッシュを使用せず、 の序数値をその内部の へのインデックスまたはペアとしてEnumeration constant
使用しput
ます。get
<K, V>
array
EnumMap.putのソース コードを確認してください。
「EnumHashMap」という名前のリンクは、実際には「EnumMap」という名前のクラスを指しています。そこにはハッシュは含まれていません。
列挙型マップは、内部的に配列として表されます。この表現は非常にコンパクトで効率的です
議論のために、 enum - 値の整数へのマッピング (上記の配列へのインデックスとして) はハッシュ関数であり、衝突がないため完全であると主張することができます。
EnumMap はハッシュベースではなく、配列に基づいています
プライベートな一時的な K[] keyUniverse; ... プライベートな一時的な Object[] vals;