日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EnumMap的用法和源码解析

發(fā)布時間:2025/5/22 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EnumMap的用法和源码解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

EnumMap的用法

? ?EnumMap顧名思義是保存枚舉類型的Map.它要求map的key是枚舉類型。這點在類定義的時候就已經(jīng)聲明好了EnumMap<K extends Enum<K>, V>,如何不是枚舉類型編譯會出錯。

?eg:定義了一個Enum類 JdbcType。

? ?public enum JdbcType {
? ? ? ? INT,NUMBER,VARCHAR,VARCHAR2,LONG,BLOB,CHAR;
? ?}

--------------------------------------------EnumMap的一個簡單應(yīng)用-----------------------------------------------

public class EnumMapTest {

public static void main(String[] args) {
? ? ?EnumMap<JdbcType, String> enumMap=new EnumMap<JdbcType, String>(JdbcType.class);
? ? ?enumMap.put(JdbcType.INT, "INT TYPE");
? ? ?enumMap.put(JdbcType.NUMBER, "NUMBER TYPE");
? ? ?enumMap.put(null,"NULL ");
? ? ?System.out.println(enumMap.get(JdbcType.INT));
}
}

? ? EnumMap的有什么優(yōu)點,為什么我們要用EnumMap。

? ? ? ? ? .1 相比HashMap,EnumMap的性能和速度要快的多。EnumMap里面的數(shù)據(jù)結(jié)構(gòu)是數(shù)組,獲取的數(shù)據(jù)的時候特別快。而且添加的數(shù)據(jù)的時候(一般用put(K,V)),這里面的并不像一般數(shù)組一樣,當(dāng)插入到中間的位置時候,要數(shù)組整體移動(一般實現(xiàn)依次向后移動)。EnumMap實現(xiàn)不需要,因為數(shù)組在EnumMap實例化的時候就已經(jīng)初始化好了,要做的就是對原來的oldValue進(jìn)行覆蓋,這樣無論獲取數(shù)據(jù)還是添加和刪除數(shù)據(jù)都要快的多。這里特別提示一下,為什么EnumMap能夠用數(shù)組,這得益于EnumMap的key是枚舉類型,枚舉類類型中每一種類型,在聲明的時候都有確定的位置,可以通過對應(yīng)的位置確定的枚舉類型。通過該方法獲得位置key.ordinal();

? ? ? ? ? 2.枚舉類型的相應(yīng)的類型更加明確,key對應(yīng)的范圍更加明確。列如的key是string,那么你的鍵范圍無法確定。所以能夠用EnumMap,盡量用EnumMap這也是一種代碼優(yōu)化方案’

? ? ?EnumMap的大量用到各種框架中,在Mabatis的TypeHandlerRegistry中就用到了EnumMap:
??

? ? ?public final class TypeHandlerRegistry {

? ? ?private final Map<JdbcType, TypeHandler<?>> JDBC_TYPE_HANDLER_MAP = new EnumMap<JdbcType, TypeHandler<?>>(JdbcType.class);

? ? ?有興趣的同學(xué)可以去看看TypeHandlerRegistry源碼,會對EnumMap理解更加透徹。

? 下面對EnumMap源碼進(jìn)行解析:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? public EnumMap(Class<K> keyType) {? ?//EnumMap的構(gòu)造器? keyType是key的類型,只能是枚舉類型,否則不能編譯過去
? ? ? ? ? ? ? ? ?this.keyType = keyType;?
? ? ? ? ? ? ? ? ?keyUniverse = getKeyUniverse(keyType);//getKeyUniverse方面獲得該枚舉中所有類型,返回一個數(shù)組該枚舉類型中所有實例

? ? ? ? ? ? ? ? ?vals = new Object[keyUniverse.length];//初始化該數(shù)組,該數(shù)組大小不會改變,因為枚舉類型確定了,相同的鍵會進(jìn)行值的覆蓋,該數(shù)組也是map底層的數(shù)據(jù)結(jié)構(gòu)

? ? ? ? ? ? ?}


?

? ? ? ? 新增方法:

public V put(K key, V value) {
typeCheck(key); //類型檢查,只有該enum類型才能,進(jìn)行數(shù)據(jù)錄入。實際開發(fā)中null值可以編譯通過,但是到這步檢查會報空指針。

int index = key.ordinal();//獲取改值在enum中的聲明的位置,通過該位置定位該值
Object oldValue = vals[index];
vals[index] = maskNull(value);
if (oldValue == null) //oldNull為null為新增,oldNull有值進(jìn)行覆蓋
size++;
return unmaskNull(oldValue);
}

該方法 的用法API說的很清楚了:

? ?Associates the specified value with the specified key in this map.

? ?If the map previously contained a mapping for this key, the old
? ?value is replaced.


? ? ? ? ? ? 刪除方法:

? ? ? ? ? ? ? ? ? ? ? public V remove(Object key) {

if (!isValidKey(key)) // 如何該key是null,或者不是初始化時enum類型,直接返回null,不進(jìn)行刪除操作
return null;
int index = ((Enum<?>)key).ordinal(); //獲取該值的位置,也是在數(shù)組中位置
Object oldValue = vals[index]; //定位該值
vals[index] = null; //對該值賦值null,也就是常見的邏輯刪除,故刪除速度也很快,不進(jìn)行數(shù)組移動,定位之后,進(jìn)行賦值操作
if (oldValue != null) //原來有值對數(shù)組大小進(jìn)行-1操作,否則不操作。
size--;
return unmaskNull(oldValue);
}


? ? ? ? ? ? ? ?get值方法:該方法很簡單不做解釋:

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

?

?EnumMap源碼就解析到這里了,感興趣的同學(xué)可以自己看看。

?

轉(zhuǎn)載于:https://www.cnblogs.com/caibixiang123/p/9214086.html

總結(jié)

以上是生活随笔為你收集整理的EnumMap的用法和源码解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。