2

ハッシュ関数のハッシュ キーのリストが既知で不変の場合、完全なハッシュ関数を生成できます。JavaのEnumは、既知の不変要素のリストです。したがって、 EnumMapを完全なハッシュとして実装できるはずです。これは現在 (1.7) Java で行われていますか?

4

4 に答える 4

6

いいえ EnumMap、ハッシュは使用しません。enum序数値を値型の配列へのインデックスとして使用します。

参照:

于 2013-06-07T09:46:13.963 に答える
3

EnumMapデータに対して内部的にHashMapハッシュを使用するようなものではありません。はと のペアを格納するために使用されます(宣言中のの位置は序数値として知られています) をorデータに内部的に使用します。 Enum.ordinalメソッドは、指定された の取得に使用されます。putgetArray<K, V>KEnumeration constantordinal valueEnumeration constantEnumputgetordinal valueEnumeration constant

言い換えると、EnumMapはハッシュを使用せず、 の序数値をその内部の へのインデックスまたはペアとしてEnumeration constant使用しputます。get<K, V>array

EnumMap.putのソース コードを確認してください。

于 2013-06-07T09:50:23.333 に答える
3

「EnumHashMap」という名前のリンクは、実際には「EnumMap」という名前のクラスを指しています。そこにはハッシュは含まれていません。

列挙型マップは、内部的に配列として表されます。この表現は非常にコンパクトで効率的です

議論のために、 enum - 値の整数へのマッピング (上記の配列へのインデックスとして) はハッシュ関数であり、衝突がないため完全であると主張することができます。

于 2013-06-07T09:49:09.963 に答える
1

EnumMap はハッシュベースではなく、配列に基づいています

プライベートな一時的な K[] keyUniverse; ... プライベートな一時的な Object[] vals;

于 2013-06-07T09:49:28.553 に答える