最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Java中的EnumMap和EnumSet

 更新時(shí)間:2023年11月08日 10:19:45   作者:flydean程序那些事  
這篇文章主要介紹了深入理解Java中的EnumMap和EnumSet,一般來(lái)說(shuō)我們會(huì)選擇使用HashMap來(lái)存儲(chǔ)key-value格式的數(shù)據(jù),考慮這樣的特殊情況,一個(gè)HashMap的key都來(lái)自于一個(gè)Enum類(lèi),這樣的情況則可以考慮使用本文要講的EnumMap,需要的朋友可以參考下

簡(jiǎn)介

一般來(lái)說(shuō)我們會(huì)選擇使用HashMap來(lái)存儲(chǔ)key-value格式的數(shù)據(jù),考慮這樣的特殊情況,一個(gè)HashMap的key都來(lái)自于一個(gè)Enum類(lèi),這樣的情況則可以考慮使用本文要講的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是類(lèi)似的,我們這里就不多講了。

什么時(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很類(lèi)似,EnumSet是一個(gè)set,然后set中的元素都是某個(gè)Enum類(lèi)型。

EnumSet是一個(gè)interface而不是一個(gè)類(lèi),要?jiǎng)?chuàng)建EnumSet類(lèi)可以使用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類(lèi),返回一個(gè)空的Enum類(lèi)型的EnumSet。

從上面的代碼我們可以看到EnumSet有兩個(gè)實(shí)現(xiàn),長(zhǎng)度大于64的時(shí)候使用JumboEnumSet,小有64的時(shí)候使用RegularEnumSet。

注意,JumboEnumSet和RegularEnumSet不建議直接使用,他是內(nèi)部使用的類(lè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)文章

  • MyBatis全局配置文件詳解

    MyBatis全局配置文件詳解

    這篇文章主要介紹了mybatis 加載配置文件的方法,通過(guò)實(shí)例代碼給大家介紹了mybatis 加載配置文件的兩種方式,需要的朋友可以參考下
    2021-07-07
  • Java開(kāi)發(fā)學(xué)習(xí) Java數(shù)組操作工具

    Java開(kāi)發(fā)學(xué)習(xí) Java數(shù)組操作工具

    這篇文章主要為大家詳細(xì)介紹了自己編寫(xiě)的Java數(shù)組操作工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 一文徹底搞懂Java中的回調(diào)函數(shù)

    一文徹底搞懂Java中的回調(diào)函數(shù)

    回調(diào)是一種常見(jiàn)的編程模式,允許一個(gè)函數(shù)在特定事件或任務(wù)完成后,調(diào)用另一個(gè)預(yù)先定義的函數(shù),這篇文章主要介紹了Java中回調(diào)函數(shù)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-01-01
  • mybatis-xml映射文件及mybatis動(dòng)態(tài)sql詳解

    mybatis-xml映射文件及mybatis動(dòng)態(tài)sql詳解

    XML映射文件的名稱與Mapper接口名稱一致,并且將XML映射文件和Mapper接口放置在相同包下(同包同名),這篇文章主要介紹了mybatis-xml映射文件及mybatis動(dòng)態(tài)sql的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 聊聊為什么要使用BufferedReader讀取File

    聊聊為什么要使用BufferedReader讀取File

    這篇文章主要介紹了為什么要使用BufferedReader讀取File,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringCloud通過(guò)MDC實(shí)現(xiàn)分布式鏈路追蹤

    SpringCloud通過(guò)MDC實(shí)現(xiàn)分布式鏈路追蹤

    在DDD領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中,我們使用SpringCloud來(lái)去實(shí)現(xiàn),但排查錯(cuò)誤的時(shí)候,通常會(huì)想到Skywalking,但是引入一個(gè)新的服務(wù),增加了系統(tǒng)消耗和管理學(xué)習(xí)成本,對(duì)于大型項(xiàng)目比較適合,但是小的項(xiàng)目顯得太過(guò)臃腫了,所以本文介紹了SpringCloud通過(guò)MDC實(shí)現(xiàn)分布式鏈路追蹤
    2024-11-11
  • java自定義線程池的原理簡(jiǎn)介

    java自定義線程池的原理簡(jiǎn)介

    這篇文章主要介紹了java自定義線程池的原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • SpringBoot導(dǎo)出Excel表格到指定路徑的代碼詳解

    SpringBoot導(dǎo)出Excel表格到指定路徑的代碼詳解

    Spring Boot導(dǎo)出Excel通常涉及到使用第三方庫(kù)如Apache POI或者XlsxWriter等,它們能幫助你在Spring應(yīng)用中生成并下載Excel文件,那么SpringBoot如何導(dǎo)出Excel表格到指定路徑,本文將給大家詳細(xì)的介紹一下
    2024-07-07
  • slf4j與log4j全面了解

    slf4j與log4j全面了解

    下面小編就為大家?guī)?lái)一篇slf4j與log4j全面了解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • java大話之創(chuàng)建型設(shè)計(jì)模式教程示例

    java大話之創(chuàng)建型設(shè)計(jì)模式教程示例

    這篇文章主要為大家介紹了java大話之創(chuàng)建型設(shè)計(jì)模式教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評(píng)論

黔西县| 北京市| 潍坊市| 田阳县| 齐齐哈尔市| 曲阳县| 淮安市| 漠河县| 邢台县| 拜城县| 潮州市| 雷波县| 鄄城县| 呼和浩特市| 漾濞| 万山特区| 奇台县| 东光县| 阳朔县| 嘉善县| 女性| 德阳市| 桦川县| 宜兰县| 台北县| 玉林市| 轮台县| 龙井市| 怀安县| 古蔺县| 吐鲁番市| 丹寨县| 宁夏| 资溪县| 大埔区| 鄂托克前旗| 嘉黎县| 大连市| 六盘水市| 白城市| 兴化市|