すでにHashMap
があるのに、なぜEnumMap
を使用するのでしょうか?
Javadoc はかなり良い議論になります:
列挙型マップは、内部的に配列として表されます。この表現は非常にコンパクトで効率的です。
実装上の注意:すべての基本操作は一定時間で実行されます。それらは(保証されていませんが)HashMapの対応物よりも高速である可能性があります。
EnumMapの主な理由は、列挙型用に特別に最適化されていることです。さらなる利点は以下に記載されています。
1)EnumMapとHashMapの何よりも重要な違いは、EnumMapが列挙型キー用に最適化されているのに対し、HashMapはHashtableと同様の汎用マップ実装であるということです。 EnumMapのキーとしてEnum以外のタイプを使用することはできませんが、HashMapのキーとしてEnumと他のオブジェクトの両方を使用できます。
2)EnumMapとHashMapのもう1つの違いは、パフォーマンスです。前のポイントで説明したように、列挙型キーに対して行われる特殊な最適化により、列挙型をキーオブジェクトとして使用する場合、列挙型はハッシュマップよりもパフォーマンスが向上する可能性があります。
3)HashMapとEnumMapの違いと見なすことができるもう1つのことは、衝突の確率です。 Enumは内部的に配列として維持され、それらは、EnumMapのput()メソッドから取得された次のコードに示すように、ordinal()を使用して自然な順序で格納されるためです。
int index = ((Enum)key).ordinal();
Object oldValue = vals[index];
vals[index] = maskNull(value);