Java中的EnumMap集合解析
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.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-06Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options詳解
這篇文章主要介紹了Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Java中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-09java格式化數(shù)字操作 NumberFormat及DecimalFormat
這篇文章主要介紹了java格式化數(shù)字操作 NumberFormat及DecimalFormat,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Java中時(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-03Spring 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-03SpringMVC訪問(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)目詳解
這篇文章主要給大家介紹了關(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