前面已經(jīng)介紹了好多Map了跳昼,今天再來介紹一個搜锰,跟Enum相關(guān)的Map, EnumMap.
那么這個Map跟之前介紹的那些Map有什么區(qū)別呢?
EnumMap的key,必須是Enum類型的.
實際上维贺,它實現(xiàn)起來非常簡單.
我們可以通過Enum類型的values()方法來獲取到一個Enum中所有數(shù)據(jù)的數(shù)組.
那這不就很簡單了嗎?
EnumMap中維護著一個key的數(shù)組(keyUniverse)和一個value的數(shù)組(vals).由Enum的性質(zhì)告唆,我們可以知道,Enum.values()得到的數(shù)組簇秒,一定是定長的鱼喉,并且其中的數(shù)據(jù)是不重復的.
所以,keyUniverse以及vals的長度都可以是固定的趋观,沒有動態(tài)擴容的問題.
所以扛禽,我們在插入數(shù)據(jù)時,比如put(K key, V value)方法皱坛,我們可以先獲取key在原Enum中的位置旋圆,然后在vals的給定位置中,插入數(shù)據(jù).
就這樣麸恍,很簡單吧?
它內(nèi)部也沒有一些難懂的操作.
唯一有一個稍微難懂一點的方法就是getKeyUniverse(Class<K> keyType):
這個方法的作用就是獲取Enum中所有的數(shù)據(jù),并返回一個數(shù)組.
EnumMap由于其實現(xiàn)特性,所以抹沪,它的性能相對于HashMap等高一些刻肄,因為它沒有碰撞的問題,也沒有擴容的問題.所以基本上所有的操作的時間復雜度都是O(1).
它也允許Null值.
另外融欧,跟其他的Map一樣敏弃,EnumMap也是非線程安全的,但是它不是Fail-Fast的.
總的來說噪馏,如果你的key是一個枚舉類型麦到,那么用這個EnumMap要好一些.