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ù)據(jù)類型它是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ù)據(jù)的時候,首先進行類型檢查
private void typeCheck(K key) {
Class<?> keyClass = key.getClass();
if (keyClass != keyType && keyClass.getSuperclass() != keyType)
throw new ClassCastException(keyClass + " != " + keyType);
}然后獲取該枚舉的索引值以該索引為vals數(shù)組的索引存放數(shù)據(jù)
檢查的邏輯是判斷當前類和父類是否是指定的枚舉類型,如果不是會拋出ClassCastException 類型檢查之后,存放數(shù)據(jù),數(shù)據(jù)的存放在EnumMap中對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會將其替換成一個重寫了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ù)的時候如果是上面的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轉(zhuǎn)換
到此這篇關(guān)于Java中的EnumMap集合解析的文章就介紹到這了,更多相關(guān)Java的EnumMap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Boot?配置?Hikari?數(shù)據(jù)庫連接池的操作代碼
數(shù)據(jù)庫連接池是一個提高程序與數(shù)據(jù)庫的連接的優(yōu)化,連接池它主要作用是提高性能、節(jié)省資源、控制連接數(shù)、連接管理等操作,這篇文章主要介紹了SpringBoot配置Hikari數(shù)據(jù)庫連接池,需要的朋友可以參考下2023-09-09
SpringMVC中controller接收json數(shù)據(jù)的方法
這篇文章主要為大家詳細介紹了SpringMVC中controller接收json數(shù)據(jù)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09
Intellij IDEA實現(xiàn)SpringBoot項目多端口啟動的兩種方法
有時候使用springboot項目時遇到這樣一種情況,用一個項目需要復(fù)制很多遍進行測試,除了端口號不同以外,沒有任何不同。遇到這種情況怎么辦呢?這時候可以使用Intellij IDEA解決2018-06-06
JSON字符串轉(zhuǎn)成java的Map對象詳細步驟
這篇文章主要介紹了如何將JSON字符串轉(zhuǎn)換為Java對象的步驟,包括定義Element類、使用Jackson庫解析JSON和添加依賴,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-01-01
Java利用Map實現(xiàn)計算文本中字符個數(shù)
這篇文章主要為大家詳細介紹了Java如何利用Map集合實現(xiàn)計算文本中字符個數(shù),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-08-08
SpringBoot中@ConfigurationProperties注解實現(xiàn)配置綁定的三種方法
這篇文章主要介紹了SpringBoot中@ConfigurationProperties注解實現(xiàn)配置綁定的三種方法,文章內(nèi)容介紹詳細需要的小伙伴可以參考一下2022-04-04

