深入理解Java中的EnumMap和EnumSet
簡介
一般來說我們會選擇使用HashMap來存儲key-value格式的數(shù)據(jù),考慮這樣的特殊情況,一個HashMap的key都來自于一個Enum類,這樣的情況則可以考慮使用本文要講的EnumMap。
EnumMap
先看一下EnumMap的定義和HashMap定義的比較:
public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V> implements java.io.Serializable, Cloneable
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
我們可以看到EnumMap幾乎和HashMap是一樣的,區(qū)別在于EnumMap的key是一個Enum。
下面看一個簡單的使用的例子:
先定義一個Enum:
public enum Types { RED, GREEN, BLACK, YELLO }
再看下怎么使用EnumMap:
@Test public void useEnumMap(){ EnumMap<Types, String> activityMap = new EnumMap<>(Types.class); activityMap.put(Types.BLACK,"black"); activityMap.put(Types.GREEN,"green"); activityMap.put(Types.RED,"red"); }
其他的操作其實和hashMap是類似的,我們這里就不多講了。
什么時候使用EnumMap
因為在EnumMap中,所有的key的可能值在創(chuàng)建的時候已經(jīng)知道了,所以使用EnumMap和hashMap相比,可以提升效率。
同時,因為key比較簡單,所以EnumMap在實現(xiàn)中,也不需要像HashMap那樣考慮一些復(fù)雜的情況。
EnumSet
跟EnumMap很類似,EnumSet是一個set,然后set中的元素都是某個Enum類型。
EnumSet是一個interface而不是一個類,要創(chuàng)建EnumSet類可以使用EnumSet提供的兩個靜態(tài)方法,noneOf和allOf。
先看一個noneOf:
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) { Enum<?>[] universe = getUniverse(elementType); if (universe == null) throw new ClassCastException(elementType + " not an enum"); if (universe.length <= 64) return new RegularEnumSet<>(elementType, universe); else return new JumboEnumSet<>(elementType, universe); }
noneOf傳入一個Enum類,返回一個空的Enum類型的EnumSet。
從上面的代碼我們可以看到EnumSet有兩個實現(xiàn),長度大于64的時候使用JumboEnumSet,小有64的時候使用RegularEnumSet。
注意,JumboEnumSet和RegularEnumSet不建議直接使用,他是內(nèi)部使用的類。
再看一下allOf:
public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) { EnumSet<E> result = noneOf(elementType); result.addAll(); return result; }
allOf很簡單,先調(diào)用noneOf創(chuàng)建空的set,然后調(diào)用addAll方法將所有的元素添加進(jìn)去。
總結(jié)
EnumMap和EnumSet對特定的Enum對象做了優(yōu)化,可以在合適的情況下使用。
到此這篇關(guān)于深入理解Java中的EnumMap和EnumSet的文章就介紹到這了,更多相關(guān)EnumMap和EnumSet內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java項目中常用指標(biāo)UV?PV?QPS?TPS含義以及統(tǒng)計方法
文章介紹了現(xiàn)代Web應(yīng)用中性能監(jiān)控和分析的重要性,涵蓋了UV、PV、QPS、TPS等關(guān)鍵指標(biāo)的統(tǒng)計方法,并提供了示例代碼,同時,文章還討論了性能優(yōu)化和瓶頸分析的策略,以及使用Grafana等可視化工具進(jìn)行監(jiān)控與告警的重要性2025-01-01Java?jar打包成exe應(yīng)用程序的詳細(xì)步驟
本文主要介紹了Java?jar打包成exe應(yīng)用程序的詳細(xì)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01深入理解Java定時調(diào)度(Timer)機(jī)制
這篇文章主要介紹了深入理解Java定時調(diào)度(Timer)機(jī)制,本節(jié)我們主要分析 Timer 的功能。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01基于Netty實現(xiàn)WebSocket的常用處理器及區(qū)別解析
文章介紹了Netty中的ChannelInboundHandlerAdapter和SimpleChannelInboundHandler處理器,以及WebSocket的幾種常見幀類型,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-02-02靜態(tài)方法中調(diào)用Spring注入過程解析
這篇文章主要介紹了靜態(tài)方法中調(diào)用Spring注入過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11