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

Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet

 更新時間:2022年05月16日 08:29:58   作者:??蘇州程序大白????  
這篇文章主要介紹了Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet,EnumMap即屬于一個Map,下文圍繞主題展開詳細內(nèi)容,需要的小伙伴可以參考參考一下

前言

Java 中常規(guī)的集合工具,相比大家都熟練于胸,但是如果說有一個集合類你不一定知道或者說肯定沒用過,你相不相信呢?今天跟大家介紹的就是 java.util.EnumMap,也是 java.util 包下面的一個集合類,同樣的也有對應的的 java.util.EnumSet,下面我們看一下吧。

Map和 Set 結(jié)構(gòu)在我們?nèi)粘9ぷ鞯氖褂玫奶貏e多,經(jīng)常會用來存放數(shù)據(jù)或者參數(shù)傳遞,不過有些場景在使用 Map 的時候,不知道大家會不會感受到一絲絲的不安,畢竟 Map 的數(shù)據(jù)設置我們沒辦法控制,完全不知道別人會 put 一些什么樣的數(shù)據(jù)進去,或者說如果某些場景我們 Map 的數(shù)據(jù) Key 的類型和個數(shù)是固定,那在這種情況的下,我們?nèi)绾翁嵘到y(tǒng)的安全性和性能呢?

這個時候我們就可以考慮使用 EnumMap,EnumMap顧名思義首先是一個 Map,其次它的 key只能是枚舉,大家都知道枚舉中的實例個數(shù)是固定的,而且還是預編譯的,所以在很大程度上保證了數(shù)據(jù)的安全性,同時也可以提升一定的性能。

EnumMap

下面我們來看下如何使用 EnumMap,首先我們需要創(chuàng)建一個枚舉 Color。

package com.ziyou.demo.enums;
/**
 * <br>
 * <b>Function:</b><br>
 * <b>Author:</b><br>
 * <b>Date:</b>2022-04-17 <br>
 * <b>Desc:</b>無<br>
 */
public enum Color 
{
  BLUE("blue", "藍色"),
  RED("red", "紅色"),
  ;
  public String color;
  public String desc;

  Color(String color, String desc) 
  {
    this.color = color;
    this.desc = desc;
  }
}

在創(chuàng)建一個測試類:

package com.ziyou.demo.enums;

import java.util.EnumMap;

/**
 * <br>
 * <b>Function:</b><br>
 * <b>Author:</b><br>
 * <b>Date:</b>2022-04-17 <br>
 * <b>Desc:</b>無<br>
 */
public class ColorTest 
{
  public static void main(String[] args) 
  {
    EnumMap<Color, String> enumMap = new EnumMap<>(Color.class);
    enumMap.put(Color.RED, "我是一個紅色枚舉");
    enumMap.put(Color.BLUE, "我是一個藍色枚舉");
    System.out.println(enumMap.get(Color.BLUE));
  }
}

 我們可以看到構(gòu)造 EnumMap 的時候需要傳入一個枚舉類,后續(xù)的 put 和 get 都跟普通的 Map 一樣,只不過這個時候 put 的時候 key 必須是該枚舉實例了。接下來我們看下EnumMap的 put 和 get 方法是如何實現(xiàn)的,查看 JDK 源碼我們可以看到。

    public V put(K key, V value) 
    {
        typeCheck(key);

        int index = key.ordinal();
        Object oldValue = vals[index];
        vals[index] = maskNull(value);
        if (oldValue == null)
            size++;
        return unmaskNull(oldValue);
    }

在進行 put的時候,會先進行類型檢查,如果說傳進來的不是枚舉或者說不是在構(gòu)造的時候指定的枚舉,這里就會拋出異常。當類型檢查通過以后,會通過枚舉的 ordinal() 方法獲取該枚舉實例的索引,這個方法會返回一個 int 值,返回的值跟枚舉在編寫的時候的順序有關系,比如說我們上面創(chuàng)建的 Color 枚舉,Color.BLUE.ordinal() 會返回 0,Color.RED.ordinal() 會返回 1。拿到索引過后,就會在對應的數(shù)組位置上放上 value 值。

 獲取數(shù)據(jù)的時候就更簡單了,直接通過 key 獲取到索引,然后從數(shù)組中那去數(shù)據(jù)即可。

  public V get(Object key) 
  {
        return (isValidKey(key) ?
                unmaskNull(vals[((Enum<?>)key).ordinal()]) : null);
    }

可以看到整個 EnumMap的 put和 get的效率是非常高的,都是在一維數(shù)組中直接根據(jù)索引定向處理。所以后續(xù)大家在類似的場景中可以嘗試使用這種方式來提升性能。

EnumSet

說完了 EnumMap 我們再來看看 EnumSetEnumSet 是一個用來操作 Enum 的集合,是一個抽象類,它有兩個繼承類,JumboEnumSet 和 RegularEnumSet。在使用的時候,需要確定枚舉類型。通過下面的方式可以創(chuàng)建一個空的 EnumSet,在后續(xù)進行使用。

public static void main(String[] args)
 {
    EnumSet<Color> enumSet = EnumSet.noneOf(Color.class);
    enumSet.add(Color.BLUE);
    enumSet.add(Color.RED);
    System.out.println(enumSet.size());
  }

EnumSet的構(gòu)造方式相對會多一點,我們可以創(chuàng)建空的集合,同時我們也可以直接根據(jù)創(chuàng)建一個完整的集合,沒必要創(chuàng)建空的然后再進行 add操作,如下所示:

  public static void main(String[] args) 
  {
    EnumSet<Color> enumSet = EnumSet.allOf(Color.class);
    System.out.println(enumSet.size());
  }

另外前面提到會使用到枚舉的 ordinal()方式,所以我們在構(gòu)造 EnumSet 的時候還可以只構(gòu)造指定兩個枚舉范圍之間的所有枚舉值,這里要注意 range方法的第二哥參數(shù)的枚舉不能在第一個枚舉前面。

EnumSet.range(Color.BLUE,Color.RED);

還可以通過 EnumSet的 of 方法來構(gòu)造指定的枚舉集合,通過源碼我們可以發(fā)現(xiàn)不管是通過什么方法了構(gòu)造,底層都是先構(gòu)造一個空集合,然后將對應的枚舉元素添加進行。構(gòu)造空集合的實現(xiàn)邏輯如下,這里我們可以看到,當枚舉個數(shù)大于 64 的時候,采用的是 JumboEnumSet 這個子類,否則都是 RegularEnumSet這個子類,正常來說一個枚舉的實例個數(shù)超過 64的會比較少吧。

 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);
    }

到此這篇關于Java 中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet的文章就介紹到這了,更多相關java  EnumSet內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java實現(xiàn)九宮格游戲

    java實現(xiàn)九宮格游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)九宮格游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • IDEA2023常用配置指南(JDK/系統(tǒng)設置等常用配置)

    IDEA2023常用配置指南(JDK/系統(tǒng)設置等常用配置)

    idea很強大,但是初次安裝默認的有很多設置并不是滿足我們開發(fā)的需要,下面這篇文章主要給大家介紹了關于IDEA2023常用配置(JDK/系統(tǒng)設置等常用配置)的相關資料,需要的朋友可以參考下
    2023-12-12
  • Java利用配置重試策略解決超時問題

    Java利用配置重試策略解決超時問題

    在web應用中,由于網(wǎng)絡原因或其他不可預測的原因,應用間會出現(xiàn)調(diào)用失敗的情形,通過配置重試策略可以有效解決外在原因?qū)е碌南到y(tǒng)故障。本文就來詳細說說如何利用配置重試策略解決超時問題
    2022-10-10
  • 基于IDEA建立module操作步驟解析

    基于IDEA建立module操作步驟解析

    這篇文章主要介紹了基于IDEA建立module操作步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • springMarchal集成xStream的完整示例代碼

    springMarchal集成xStream的完整示例代碼

    這篇文章主要介紹了springMarchal集成xStream的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • Java?超詳細講解類的定義方式和對象的實例化

    Java?超詳細講解類的定義方式和對象的實例化

    Java是一門純面向?qū)ο蟮恼Z言(Object?Oriented?Program,繼承OOP),在面對對象的世界里面,一切皆為對象。面向?qū)ο笫墙鉀Q問題的一種思想,主要依靠對象之間的交互完成一件事情
    2022-03-03
  • ShardingSphere結(jié)合MySQL實現(xiàn)分庫分表的項目實踐

    ShardingSphere結(jié)合MySQL實現(xiàn)分庫分表的項目實踐

    在實際開發(fā)中,如果表的數(shù)據(jù)過大我們需要把一張表拆分成多張表,本文主要介紹了使用ShardingSphere實現(xiàn)MySQL分庫分表,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Java基于redis實現(xiàn)分布式鎖

    Java基于redis實現(xiàn)分布式鎖

    系統(tǒng)的不斷擴大,分布式鎖是最基本的保障。今天我們介紹通過redis實現(xiàn)分布式鎖,感興趣的朋友可以參考下
    2021-05-05
  • Java對日期Date類進行加減運算、年份加減月份加減、時間差等等

    Java對日期Date類進行加減運算、年份加減月份加減、時間差等等

    這篇文章主要介紹了Java對日期Date類進行加減運算、年份加減月份加減、時間差等等,在網(wǎng)上查閱資料,加上自己總結(jié)的一些關于Date類的工具類
    2017-01-01
  • 淺談springboot項目中定時任務如何優(yōu)雅退出

    淺談springboot項目中定時任務如何優(yōu)雅退出

    這篇文章主要介紹了淺談springboot項目中定時任務如何優(yōu)雅退出?具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論

潞西市| 高台县| 大田县| 金沙县| 柳州市| 出国| 汝州市| 寿宁县| 乐都县| 健康| 合山市| 正宁县| 新建县| 万州区| 高碑店市| 崇义县| 普兰店市| 河北省| 葵青区| 邻水| 封开县| 古交市| 沁源县| 塔河县| 鸡东县| 吴堡县| 芦溪县| 清水河县| 清涧县| 建始县| 荣成市| 黑龙江省| 格尔木市| 寿宁县| 旺苍县| 老河口市| 梅河口市| 白银市| 当阳市| 禄劝| 那曲县|