中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

怎么使用Java中的EnumMap

這篇文章主要講解了“怎么使用Java中的EnumMap”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么使用Java中的EnumMap”吧!

成都創(chuàng)新互聯(lián)公司是一家專業(yè)從事網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司。作為專業(yè)的建站公司,成都創(chuàng)新互聯(lián)公司依托的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、成都全網(wǎng)營銷推廣及網(wǎng)站設(shè)計(jì)開發(fā)服務(wù)!

提到Java中集合Map,你可能常用的是HashMap/ConcurrentHashMap,但是當(dāng)Map的key是枚舉類型時(shí),是否想過使用EnumMap了?

那么當(dāng)key是枚舉類型時(shí),EnumMap和HashMap的區(qū)別是啥?

  • HashMap:使用Hash表存儲(chǔ),底層是數(shù)組,數(shù)組中存的是entry對(duì)象,默認(rèn)長(zhǎng)度是16。也就說每次向Map中加入對(duì)象,首先根據(jù)key值計(jì)算hash值,然后根據(jù)數(shù)組長(zhǎng)度放到合適的位置,當(dāng)發(fā)生沖突時(shí),使用"開鏈法",即在沖突位置加入鏈表;Java8在解決沖突時(shí),又新增了紅黑樹的解決方案??傮w來說,HashMap就是空間換時(shí)間的方式來提高訪問效率。但是假如我們已知key的所有值時(shí),是否還有必要每次都要計(jì)算hash值,然后找位置,解決沖突,甚者擴(kuò)容了...

  • EnumMap:既然已知了所有key,那么申請(qǐng)已知大小的數(shù)組,每次訪問時(shí)根據(jù)枚舉變量的ordinal值定位到數(shù)組的指定位置,存取即可,這樣是不是既高效,且不會(huì)浪費(fèi)存儲(chǔ)中間。

下面就進(jìn)入EnumMap的內(nèi)部探秘吧

在這里小編建了一個(gè)前端學(xué)習(xí)交流扣扣群:132667127,我自己整理的最新的前端資料和高級(jí)開發(fā)教程,如果有想需要的,可以加群一起學(xué)習(xí)交流

主要成員:

public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V>
   implements java.io.Serializable, Cloneable {
// key值的枚舉類型
private final Class<K> keyType;

//根據(jù)key值的枚舉類型,會(huì)預(yù)先緩存所有的枚舉變量
private transient K[] keyUniverse;

/**
* 所有的vlaue值,數(shù)組的下標(biāo)是枚舉變量的序號(hào)(ordinal)
* 數(shù)組的內(nèi)容是map中枚舉變量對(duì)應(yīng)的vlaue
*/
private transient Object[] vals;

//當(dāng)前map的大小,
private transient int size = 0;
}

使用詳解:

假設(shè)預(yù)先定了這樣的Enum對(duì)象

public enum  WeekEnum {
   SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}

構(gòu)造方法:

// 構(gòu)造方法使用示例
EnumMap<WeekEnum, String> weekEnumMap = new EnumMap<>(WeekEnum.class);
// 會(huì)預(yù)先獲取所有的枚舉值,然后根據(jù)枚舉值的個(gè)數(shù),創(chuàng)建相應(yīng)大小的數(shù)組用來存放value
public EnumMap(Class<K> keyType) {
this.keyType = keyType;
keyUniverse = getKeyUniverse(keyType);
vals = new Object[keyUniverse.length];
}

put方法:

// 檢查枚舉值類型,然后根據(jù)key的序號(hào),將value存入相應(yīng)下標(biāo)的數(shù)組
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);
   }

get方法:

// 依然是先校驗(yàn)key值類型,然后根據(jù)key的序號(hào)去數(shù)組的位置取值
public V get(Object key) {
 return (isValidKey(key) ?
         unmaskNull(vals[((Enum<?>)key).ordinal()]) : null);
}

感謝各位的閱讀,以上就是“怎么使用Java中的EnumMap”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么使用Java中的EnumMap這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

分享標(biāo)題:怎么使用Java中的EnumMap
文章分享:http://www.rwnh.cn/article30/jjedso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)網(wǎng)站維護(hù)、軟件開發(fā)、品牌網(wǎng)站設(shè)計(jì)網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營
林甸县| 肇东市| 漳州市| 扬中市| 栾城县| 兴海县| 元江| 小金县| 巫溪县| 马龙县| 海兴县| 廊坊市| 铜川市| 永登县| 武平县| 抚远县| 呼和浩特市| 社旗县| 静乐县| 邓州市| 读书| 皋兰县| 精河县| 邵阳市| 武乡县| 当涂县| 白城市| 洞口县| 麻江县| 桂平市| 洪泽县| 兴山县| 香格里拉县| 温泉县| 陇西县| 江孜县| 文昌市| 静乐县| 北辰区| 贵港市| 安新县|