Java集合框架源码研读-EnumMap

Posted by AlstonWilliams on February 17, 2019

前面已经介绍了好多Map了,今天再来介绍一个,跟Enum相关的Map, EnumMap.

那么这个Map跟之前介绍的那些Map有什么区别呢?

EnumMap的key,必须是Enum类型的.

实际上,它实现起来非常简单.

我们可以通过Enum类型的values()方法来获取到一个Enum中所有数据的数组.

那这不就很简单了吗?

EnumMap中维护着一个key的数组(keyUniverse)和一个value的数组(vals).由Enum的性质,我们可以知道,Enum.values()得到的数组,一定是定长的,并且其中的数据是不重复的.

所以,keyUniverse以及vals的长度都可以是固定的,没有动态扩容的问题.

所以,我们在插入数据时,比如put(K key, V value)方法,我们可以先获取key在原Enum中的位置,然后在vals的给定位置中,插入数据.

就这样,很简单吧?

它内部也没有一些难懂的操作.

唯一有一个稍微难懂一点的方法就是**getKeyUniverse(Class keyType)**:

这个方法的作用就是获取Enum中所有的数据,并返回一个数组.

EnumMap由于其实现特性,所以,它的性能相对于HashMap等高一些,因为它没有碰撞的问题,也没有扩容的问题.所以基本上所有的操作的时间复杂度都是O(1).

它也允许Null值.

另外,跟其他的Map一样,EnumMap也是非线程安全的,但是它不是Fail-Fast的.

总的来说,如果你的key是一个枚举类型,那么用这个EnumMap要好一些.