5

についての記事を最近読みましたEnumMap「EnumMapを使用すると、列挙キーに対して行われる実装固有の利点がもたらされます。つまり、列挙キー専用に最適化されたMap実装です」と書かれています。EnumMap

また、「列挙型は配列を使用して実装されており、一般的な操作は一定の時間になります。したがって、高性能を考えている場合はMapEnumMap列挙型データの適切な選択になる可能性があります。」とも書かれています。


この最適化がどのように行われるか教えてもらえますか? ( 「演算結果は一定時間」)

4

3 に答える 3

10

EnumMapのドキュメントを見る:

Map列挙型キーで使用するための特殊な実装。列挙型マップ内のすべてのキーは、マップの作成時に明示的または暗黙的に指定された単一の列挙型から取得する必要があります。列挙型マップは、内部的に配列として表されます。この表現は非常にコンパクトで効率的です。

列挙型マップは、キーの自然な順序 (列挙型定数が宣言されている順序) で維持されます。keySet()これは、コレクション ビュー ( 、entrySet()、および)によって返される反復子に反映されますvalues()

つまり、 anEnumMapは、マップの値の型の単なる配列です。言い換えれば、 ,EnumMap<SomeEnum, SomeValue>は単なるSomeValue[].

インデックスはどのように割り当てられているのでしょうか? それらは、列挙型の自然順序によって割り当てられます。例:

enum Day {
    MON, TUE, WED, THU, FRI, SAT, SUN
}

上記の列挙型には、次の自然順序があります。

MON TUE WED THU FRI SAT SUN
 0   1   2   3   4   5   6

したがって、次のような操作map.put(Day.FRI, "Yay!")は実際には次のように表示できます。

array[4] = "Yay!";

配列アクセスは一定時間の操作であり、それがEnumMap利点でもあります。ルックアップ ( get()) も同じように機能します。

于 2013-05-19T17:26:34.120 に答える
2

ソースからわかるように、EnumMapには、 内の値の数と正確に同じ長さのオブジェクトの配列が含まれていenumます。(たとえば)putgetの場合、値の序数値がenum配列インデックスとして使用されます。この操作には明らかに一定の時間がかかります。

于 2013-05-19T17:22:52.463 に答える
1

AnEnumMapは、 内の値の数のサイズの配列によって支えられていますEnum

Enum.ordinal()次に、メソッド whengettingまたはdataのおかげで配列にアクセスしますがputting、一定の時間がかかります。

于 2013-05-19T17:23:27.257 に答える