Java集合框架3EnumMap

EnumMap定義

  • 1 以java7進行說明
package java.util;
import java.util.Map.Entry;
import sun.misc.SharedSecrets;
public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V>
    implements java.io.Serializable, Cloneable{
    private final Class<K> keyType; 
    private transient K[] keyUniverse; 
    private transient Object[] vals;
    private transient int size = 0;
}
  • 2 成員屬性說明
    1)EnumMap的鍵是繼承Enum類型的對象
    2)成員變量keyType存放的是Enum類的class辕棚,即Enum.class
    3)成員變量keyUnuverse存放的是Enum類的各個枚舉變量的值
    4)成員變量vals存放的是與keyUniverse映射的值癌压,即枚舉變量對應的翻譯值。

EnumMap數(shù)據(jù)結構

  • 1 代碼舉例
package collections.map;
import java.util.EnumMap;
import java.util.Map;
public class EnumMapTest {
    public enum Color {
        RED,BLUE,BLACK,YELLOW,GREEN;
    }
    public static void main(String[] args) {
        EnumMap<Color, String> map = new EnumMap<>(Color.class);
    map.put(Color.BLUE, null);
    map.put(Color.RED, Color.RED.ordinal() + "--紅色");
    map.put(Color.BLACK, Color.BLACK.ordinal() + "--黑色");
    // map.put(null, "無"); //會報NullPonitException的錯誤

        for(Map.Entry<Color,String> entry:map.entrySet()) {
            System.out.println(entry.getKey()+":"+entry.getValue());
        }
        System.out.println(map);
    }
}
  • 2 運行結果
RED:0--紅色
BLUE:null
BLACK:2--黑色
{RED=0--紅色, BLUE=null, BLACK=2--黑色}
  • 3 內存結構圖
  • 4 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);
    }

1)typeCheck判斷key的類對象或者父類對象是否與keyType相等,如果不相等則拋出ClassCastException異常。
2)注意EnumMap并沒有類似HashMap的resize的過程,也沒有加載因子的概念蚯涮,因為在一個EnumMap創(chuàng)建的時候,keyUniverse和vals的大小就固定卖陵。
3)EnumMap的key不允許為null遭顶,value可以為null并且按照key在enum中枚舉變量定義的順序進行存儲的,
4)EnumMap非線程安全泪蔫“羝欤可以用工具類Collections進行包裝成線程安全。

EnumMap用途

  • 1 《Effective Java》中作者建議用EnumMap代替序數(shù)索引撩荣,不要用序數(shù)來索引數(shù)組铣揉,而要使用EnumMap。
  • 2 代碼舉例
public class Herb {
    public enum Type {
        ANNUAL, BIENNTAL, PERENNIAL
    }
    private final String name;
    private final Type type;
    public Herb(String name, Type type) {
        this.name = name;
            this.type = type;
    }
    public Type getType() {
        return type;
    }
    @Override
    public String toString() {
        return name;
    }
}
  • 2 現(xiàn)在用一座種滿香草的花園餐曹,想要按照類型(一年生逛拱、兩年生、多年生台猴、朽合,即上面Type的類型)進行組織之后將這些植物列出來。
Herb[] garden = new Herb[] { new Herb("水稻", Herb.Type.ANNUAL), new Herb("烏頭", Herb.Type.PERENNIAL),
                new Herb("菠菜", Herb.Type.BIENNTAL), new Herb("側金盞花", Herb.Type.PERENNIAL),
                new Herb("高粱", Herb.Type.ANNUAL), new Herb("芹菜", Herb.Type.BIENNTAL), new Herb("花生", Herb.Type.ANNUAL),
                new Herb("桂竹香", Herb.Type.BIENNTAL), new Herb("大火草", Herb.Type.PERENNIAL) };
        Map<Herb.Type, Set<Herb>> herbsByType = new EnumMap<>(Herb.Type.class);
        for(Herb.Type t : Herb.Type.values()) {
            herbsByType.put(t, new HashSet<Herb>());
        }
        for(Herb h:garden) {
            herbsByType.get(h.type).add(h);
        }
        System.out.println(herbsByType);
  • 3 運行結果為:
{ANNUAL=[水稻, 花生, 高粱], BIENNTAL=[桂竹香, 菠菜, 芹菜], PERENNIAL=[大火草, 烏頭, 側金盞花]}

1)EnumMap是專門為枚舉類型量身定做的Map實現(xiàn)饱狂。EnumMap在內部使用枚舉類型的ordinal()得到當前實例的聲明次序曹步, 并使用這個次序維護枚舉類型實例對應值在數(shù)組的位置。
2)它只能接收同一枚舉類型的實例作為鍵值嗡官,并且由于枚舉類型實例的數(shù)量相對固定并且有限箭窜,所以EnumMap使用數(shù)組來存放與枚舉類型對應的值。這使得EnumMap的效率非常高衍腥。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末磺樱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子婆咸,更是在濱河造成了極大的恐慌竹捉,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尚骄,死亡現(xiàn)場離奇詭異块差,居然都是意外死亡,警方通過查閱死者的電腦和手機倔丈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門憨闰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人需五,你說我怎么就攤上這事鹉动。” “怎么了宏邮?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵泽示,是天一觀的道長。 經常有香客問我蜜氨,道長械筛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任飒炎,我火速辦了婚禮埋哟,結果婚禮上,老公的妹妹穿的比我還像新娘郎汪。我一直安慰自己定欧,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布怒竿。 她就那樣靜靜地躺著砍鸠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耕驰。 梳的紋絲不亂的頭發(fā)上爷辱,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音朦肘,去河邊找鬼饭弓。 笑死,一個胖子當著我的面吹牛媒抠,可吹牛的內容都是我干的弟断。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼趴生,長吁一口氣:“原來是場噩夢啊……” “哼阀趴!你這毒婦竟也來了昏翰?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤刘急,失蹤者是張志新(化名)和其女友劉穎棚菊,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叔汁,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡统求,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了据块。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片码邻。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖另假,靈堂內的尸體忽然破棺而出像屋,到底是詐尸還是另有隱情,我是刑警寧澤浪谴,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布开睡,位于F島的核電站,受9級特大地震影響苟耻,放射性物質發(fā)生泄漏篇恒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一凶杖、第九天 我趴在偏房一處隱蔽的房頂上張望胁艰。 院中可真熱鬧,春花似錦智蝠、人聲如沸腾么。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽解虱。三九已至,卻和暖如春漆撞,著一層夾襖步出監(jiān)牢的瞬間殴泰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工浮驳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悍汛,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓至会,卻偏偏與公主長得像离咐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奉件,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容

  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法宵蛀,而不是構造函數(shù)創(chuàng)建對象:僅僅是創(chuàng)建對象的方法昆著,并非Fa...
    孫小磊閱讀 1,982評論 0 3
  • 序數(shù)索引是指依賴于枚舉成員在枚舉中的序數(shù)(ordinal方法返回值)來進行數(shù)組索引,如:public class ...
    呼天闊閱讀 512評論 0 0
  • 1. Java基礎部分 基礎部分的順序:基本語法糖埋,類相關的語法宣吱,內部類的語法窃这,繼承相關的語法瞳别,異常的語法,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 《Effective Java》筆記(下) Enums and Annotations Item 30: Use ...
    OCNYang閱讀 2,037評論 1 5
  • 一杭攻、什么是枚舉祟敛? 枚舉是由一組固定的常量組成的合法值。通過這一定義兆解,我們可以看出枚舉的核心在于常量馆铁,而且常量是固定...
    Roger_黃閱讀 963評論 0 4