深入理解Java中的EnumMap和EnumSet
簡(jiǎn)介
一般來(lái)說(shuō)我們會(huì)選擇使用HashMap來(lái)存儲(chǔ)key-value格式的數(shù)據(jù),考慮這樣的特殊情況,一個(gè)HashMap的key都來(lái)自于一個(gè)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是一個(gè)Enum。
下面看一個(gè)簡(jiǎn)單的使用的例子:
先定義一個(gè)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");
}
其他的操作其實(shí)和hashMap是類似的,我們這里就不多講了。
什么時(shí)候使用EnumMap
因?yàn)樵贓numMap中,所有的key的可能值在創(chuàng)建的時(shí)候已經(jīng)知道了,所以使用EnumMap和hashMap相比,可以提升效率。
同時(shí),因?yàn)閗ey比較簡(jiǎn)單,所以EnumMap在實(shí)現(xiàn)中,也不需要像HashMap那樣考慮一些復(fù)雜的情況。
EnumSet
跟EnumMap很類似,EnumSet是一個(gè)set,然后set中的元素都是某個(gè)Enum類型。
EnumSet是一個(gè)interface而不是一個(gè)類,要?jiǎng)?chuàng)建EnumSet類可以使用EnumSet提供的兩個(gè)靜態(tài)方法,noneOf和allOf。
先看一個(gè)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傳入一個(gè)Enum類,返回一個(gè)空的Enum類型的EnumSet。
從上面的代碼我們可以看到EnumSet有兩個(gè)實(shí)現(xiàn),長(zhǎng)度大于64的時(shí)候使用JumboEnumSet,小有64的時(shí)候使用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很簡(jiǎn)單,先調(diào)用noneOf創(chuàng)建空的set,然后調(diào)用addAll方法將所有的元素添加進(jìn)去。
總結(jié)
EnumMap和EnumSet對(duì)特定的Enum對(duì)象做了優(yōu)化,可以在合適的情況下使用。
到此這篇關(guān)于深入理解Java中的EnumMap和EnumSet的文章就介紹到這了,更多相關(guān)EnumMap和EnumSet內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java項(xiàng)目中常用指標(biāo)UV?PV?QPS?TPS含義以及統(tǒng)計(jì)方法
文章介紹了現(xiàn)代Web應(yīng)用中性能監(jiān)控和分析的重要性,涵蓋了UV、PV、QPS、TPS等關(guān)鍵指標(biāo)的統(tǒng)計(jì)方法,并提供了示例代碼,同時(shí),文章還討論了性能優(yōu)化和瓶頸分析的策略,以及使用Grafana等可視化工具進(jìn)行監(jiān)控與告警的重要性2025-01-01
Java?jar打包成exe應(yīng)用程序的詳細(xì)步驟
本文主要介紹了Java?jar打包成exe應(yīng)用程序的詳細(xì)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
深入理解Java定時(shí)調(diào)度(Timer)機(jī)制
這篇文章主要介紹了深入理解Java定時(shí)調(diào)度(Timer)機(jī)制,本節(jié)我們主要分析 Timer 的功能。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
基于Netty實(shí)現(xiàn)WebSocket的常用處理器及區(qū)別解析
文章介紹了Netty中的ChannelInboundHandlerAdapter和SimpleChannelInboundHandler處理器,以及WebSocket的幾種常見(jiàn)幀類型,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-02-02
靜態(tài)方法中調(diào)用Spring注入過(guò)程解析
這篇文章主要介紹了靜態(tài)方法中調(diào)用Spring注入過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
java簡(jiǎn)單實(shí)現(xiàn)自定義日歷
這篇文章主要為大家詳細(xì)介紹了java簡(jiǎn)單實(shí)現(xiàn)自定義日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Java實(shí)現(xiàn)簡(jiǎn)易拼圖游戲的方法詳解
這篇文章主要介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易拼圖游戲,幫助大家更好的理解和使用Java開(kāi)發(fā)游戲,感興趣的朋友可以跟隨小編一起學(xué)習(xí)一下2022-05-05
Mac OS上安裝Tomcat服務(wù)器的簡(jiǎn)單步驟
這篇文章主要介紹了Mac OS上安裝Tomcat服務(wù)器的簡(jiǎn)單步驟,包括簡(jiǎn)單的啟動(dòng)命令和查看Tomcat信息的方法,需要的朋友可以參考下2015-11-11
Jlabel實(shí)現(xiàn)內(nèi)容自動(dòng)換行簡(jiǎn)單實(shí)例
這篇文章主要介紹了Jlabel實(shí)現(xiàn)內(nèi)容自動(dòng)換行簡(jiǎn)單實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01

