8、使用EnumSet或EnumMap
在某些情況下,比如在使用配置map時,我們可能會預先知道儲存在map中鍵值。如果這個鍵值非常小,我們就應該考慮使用 EnumSet 或 EnumMap,而并非使用我們常用的 HashSet 或 HashMap。下面的代碼給出了很清楚的解釋:
private transient Object[] vals;
public V put(K key, V value) {
}
上段代碼的關鍵實作在于,我們用數組代替了哈希表。尤其是向map中插入新值時,所要做的僅僅是獲得一個由編譯器為每個枚舉類型生成的常量序列号。如果有一個全局的map配置(例如隻有一個執行個體),在增加通路速度的壓力下,EnumMap 會獲得比 HashMap 更加傑出的表現。原因在于 EnumMap 使用的堆記憶體比 HashMap 要少 一位(bit),而且 HashMap 要在每個鍵值上都要調用 hashCode() 方法和 equals() 方法。
小結
Enum 和 EnumMap 是親密的小夥伴。在我們用到類似枚舉(enum-like)結構的鍵值時,就應該考慮将這些鍵值用聲明為枚舉類型,并将之作為 EnumMap 鍵。