Java中的EnumMap集合解析
EnumMap不允許鍵為空,允許值為空,需要的朋友可以參考下
EnumMap
EnumMap是Map接口的一種實(shí)現(xiàn),專門用于枚舉類型的鍵,所有枚舉的鍵必須來自同一個(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必須來自同一個(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方法很簡單,首先判斷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無法引入注解及import org.springframework.web.bind.annota
本文主要介紹了spring無法引入注解及import org.springframework.web.bind.annotation.*報(bào)錯(cuò)的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options詳解
這篇文章主要介紹了Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Java中Array List與Linked List的實(shí)現(xiàn)分析
這篇文章主要給大家介紹了關(guān)于Array List與Linked List實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
java格式化數(shù)字操作 NumberFormat及DecimalFormat
這篇文章主要介紹了java格式化數(shù)字操作 NumberFormat及DecimalFormat,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java中時(shí)間戳和時(shí)間的轉(zhuǎn)換方法代碼
這篇文章主要介紹了Java中時(shí)間戳和時(shí)間的轉(zhuǎn)換的相關(guān)資料,Java8中時(shí)間戳與日期時(shí)間對(duì)象之間的轉(zhuǎn)換是編程中常見的操作,通過時(shí)間字符串獲取時(shí)間對(duì)象也是其中的一種方法,需要的朋友可以參考下2025-03-03
Spring Cloud服務(wù)入口Gateway的介紹和使用問題小結(jié)
Spring Cloud Gateway是Spring Cloud的?個(gè)全新的API?關(guān)項(xiàng)?, 基于Spring + SpringBoot等技術(shù)開發(fā), ?的是為了替換掉Zuul,這篇文章主要介紹了Spring Cloud服務(wù)入口Gateway的介紹和使用問題小結(jié),需要的朋友可以參考下2025-03-03
SpringMVC訪問controller報(bào)錯(cuò)404的解決辦法(總結(jié)超詳細(xì))
純注解配置SpringMVC程序,使用tomcat8.5.95版本啟動(dòng),能啟動(dòng)成功并且訪問index.jsp頁面,但是訪問/save時(shí)出現(xiàn)404無法訪問,本文給大家介紹了SpringMVC訪問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)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧、2017-12-12

