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

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的EnumMap集合解析

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

EnumMap

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

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

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

下面是幾個常用的方法

源碼解讀

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必須來自同一個枚舉,在向EnumMap存放數(shù)據的時候,首先進行類型檢查

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

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

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

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會將其替換成一個重寫了toString和hashcode的Object 如下代碼所示

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

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

get

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

get方法很簡單,首先判斷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,如果是進行unmask轉換

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

相關文章

  • spring無法引入注解及import org.springframework.web.bind.annotation.*報錯的解決

    spring無法引入注解及import org.springframework.web.bind.annota

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

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

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

    Spring注入值到Bean的三種方式

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

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

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

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

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

    Java棋類游戲實踐之中國象棋

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

    Java中時間戳和時間的轉換方法代碼

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

    Spring Cloud服務入口Gateway的介紹和使用問題小結

    Spring Cloud Gateway是Spring Cloud的?個全新的API?關項?, 基于Spring + SpringBoot等技術開發(fā), ?的是為了替換掉Zuul,這篇文章主要介紹了Spring Cloud服務入口Gateway的介紹和使用問題小結,需要的朋友可以參考下
    2025-03-03
  • SpringMVC訪問controller報錯404的解決辦法(總結超詳細)

    SpringMVC訪問controller報錯404的解決辦法(總結超詳細)

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

    利用spring boot如何快速啟動一個web項目詳解

    這篇文章主要給大家介紹了關于利用spring boot如何快速啟動一個web項目的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧、
    2017-12-12

最新評論