EnumMap不允許鍵為空,允許值為空,需要的朋友可以參考下" />

亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中的EnumMap集合解析

 更新時(shí)間:2023年09月28日 08:50:09   作者:光與熱  
這篇文章主要介紹了Java中的EnumMap集合解析,EnumMap是Map接口的一種實(shí)現(xiàn),專門用于枚舉類型的鍵,所有枚舉的鍵必須來(lái)自同一個(gè)枚舉,
EnumMap不允許鍵為空,允許值為空,需要的朋友可以參考下

EnumMap

EnumMap是Map接口的一種實(shí)現(xiàn),專門用于枚舉類型的鍵,所有枚舉的鍵必須來(lái)自同一個(gè)枚舉

EnumMap不允許鍵為空,允許值為空

EnumMap成員變量

    private final Class<K> keyType;
    private transient K[] keyUniverse;
    private transient Object[] vals;
    private transient int size = 0;
    private static final Object NULL = new Object() {
    public int hashCode() {
        return 0;
    }
    public String toString() {
        return "java.util.EnumMap.NULL";
    }
};

其中有一個(gè)特別的數(shù)據(jù)類型它是Object實(shí)例NULL,用于取代真正的NULL值

下面是幾個(gè)常用的方法

源碼解讀

put

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

EnumMap key必須來(lái)自同一個(gè)枚舉,在向EnumMap存放數(shù)據(jù)的時(shí)候,首先進(jìn)行類型檢查

private void typeCheck(K key) {
    Class<?> keyClass = key.getClass();
    if (keyClass != keyType && keyClass.getSuperclass() != keyType)
        throw new ClassCastException(keyClass + " != " + keyType);
}

然后獲取該枚舉的索引值以該索引為vals數(shù)組的索引存放數(shù)據(jù)

檢查的邏輯是判斷當(dāng)前類和父類是否是指定的枚舉類型,如果不是會(huì)拋出ClassCastException 類型檢查之后,存放數(shù)據(jù),數(shù)據(jù)的存放在EnumMap中對(duì)null型數(shù)據(jù)有額外的操作

private Object maskNull(Object value) {
    return (value == null ? NULL : value);
}
@SuppressWarnings("unchecked")
private V unmaskNull(Object value) {
    return (V)(value == NULL ? null : value);
}

如果存放null值,EnumMap會(huì)將其替換成一個(gè)重寫了toString和hashcode的Object 如下代碼所示

private static final Object NULL = new Object() {
    public int hashCode() {
        return 0;
    }
    public String toString() {
        return "java.util.EnumMap.NULL";
    }
};

取數(shù)據(jù)的時(shí)候如果是上面的NULL,那么進(jìn)行unmask操作

get

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

get方法很簡(jiǎn)單,首先判斷key值是否合理

private boolean isValidKey(Object key) {
    if (key == null)
        return false;
    // Cheaper than instanceof Enum followed by getDeclaringClass
    Class<?> keyClass = key.getClass();
    return keyClass == keyType || keyClass.getSuperclass() == keyType;
}

判斷key的類型或者key的父類型是否與指定的EnumMap的鍵值類型相同

然后判斷vals中的值是否為NULL,如果是進(jìn)行unmask轉(zhuǎn)換

到此這篇關(guān)于Java中的EnumMap集合解析的文章就介紹到這了,更多相關(guān)Java的EnumMap內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring無(wú)法引入注解及import org.springframework.web.bind.annotation.*報(bào)錯(cuò)的解決

    spring無(wú)法引入注解及import org.springframework.web.bind.annota

    本文主要介紹了spring無(wú)法引入注解及import org.springframework.web.bind.annotation.*報(bào)錯(cuò)的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options詳解

    Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options詳解

    這篇文章主要介紹了Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Spring注入值到Bean的三種方式

    Spring注入值到Bean的三種方式

    這篇文章主要為大家詳細(xì)介紹了Spring注入值到Bean的三種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java中Array List與Linked List的實(shí)現(xiàn)分析

    Java中Array List與Linked List的實(shí)現(xiàn)分析

    這篇文章主要給大家介紹了關(guān)于Array List與Linked List實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java格式化數(shù)字操作 NumberFormat及DecimalFormat

    java格式化數(shù)字操作 NumberFormat及DecimalFormat

    這篇文章主要介紹了java格式化數(shù)字操作 NumberFormat及DecimalFormat,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java棋類游戲?qū)嵺`之中國(guó)象棋

    Java棋類游戲?qū)嵺`之中國(guó)象棋

    這篇文章主要為大家詳細(xì)介紹了Java棋類游戲中的中國(guó)象棋實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Java中時(shí)間戳和時(shí)間的轉(zhuǎn)換方法代碼

    Java中時(shí)間戳和時(shí)間的轉(zhuǎn)換方法代碼

    這篇文章主要介紹了Java中時(shí)間戳和時(shí)間的轉(zhuǎn)換的相關(guān)資料,Java8中時(shí)間戳與日期時(shí)間對(duì)象之間的轉(zhuǎn)換是編程中常見(jiàn)的操作,通過(guò)時(shí)間字符串獲取時(shí)間對(duì)象也是其中的一種方法,需要的朋友可以參考下
    2025-03-03
  • Spring Cloud服務(wù)入口Gateway的介紹和使用問(wèn)題小結(jié)

    Spring Cloud服務(wù)入口Gateway的介紹和使用問(wèn)題小結(jié)

    Spring Cloud Gateway是Spring Cloud的?個(gè)全新的API?關(guān)項(xiàng)?, 基于Spring + SpringBoot等技術(shù)開(kāi)發(fā), ?的是為了替換掉Zuul,這篇文章主要介紹了Spring Cloud服務(wù)入口Gateway的介紹和使用問(wèn)題小結(jié),需要的朋友可以參考下
    2025-03-03
  • SpringMVC訪問(wèn)controller報(bào)錯(cuò)404的解決辦法(總結(jié)超詳細(xì))

    SpringMVC訪問(wèn)controller報(bào)錯(cuò)404的解決辦法(總結(jié)超詳細(xì))

    純注解配置SpringMVC程序,使用tomcat8.5.95版本啟動(dòng),能啟動(dòng)成功并且訪問(wèn)index.jsp頁(yè)面,但是訪問(wèn)/save時(shí)出現(xiàn)404無(wú)法訪問(wèn),本文給大家介紹了SpringMVC訪問(wèn)controller報(bào)錯(cuò)404的解決辦法,文章總結(jié)的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • 利用spring boot如何快速啟動(dòng)一個(gè)web項(xiàng)目詳解

    利用spring boot如何快速啟動(dòng)一個(gè)web項(xiàng)目詳解

    這篇文章主要給大家介紹了關(guān)于利用spring boot如何快速啟動(dòng)一個(gè)web項(xiàng)目的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧、
    2017-12-12

最新評(píng)論