Java中的EnumMap集合解析
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.annota
本文主要介紹了spring無法引入注解及import org.springframework.web.bind.annotation.*報錯的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options詳解
這篇文章主要介紹了Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Java中Array List與Linked List的實現(xiàn)分析
這篇文章主要給大家介紹了關于Array List與Linked List實現(xiàn)的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-09-09java格式化數(shù)字操作 NumberFormat及DecimalFormat
這篇文章主要介紹了java格式化數(shù)字操作 NumberFormat及DecimalFormat,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Spring Cloud服務入口Gateway的介紹和使用問題小結
Spring Cloud Gateway是Spring Cloud的?個全新的API?關項?, 基于Spring + SpringBoot等技術開發(fā), ?的是為了替換掉Zuul,這篇文章主要介紹了Spring Cloud服務入口Gateway的介紹和使用問題小結,需要的朋友可以參考下2025-03-03SpringMVC訪問controller報錯404的解決辦法(總結超詳細)
純注解配置SpringMVC程序,使用tomcat8.5.95版本啟動,能啟動成功并且訪問index.jsp頁面,但是訪問/save時出現(xiàn)404無法訪問,本文給大家介紹了SpringMVC訪問controller報錯404的解決辦法,文章總結的非常詳細,需要的朋友可以參考下2024-05-05