Effective Java之EnumMap代替序数索引(三十三)

Map的实现类有很多种,EnumMap从名字我们可以看出这个Map是给枚举类用的。它的key为枚举元素,value自定义。在工作中我们也可以用其他的Map来实现我们关于枚举的需求,但是为什么要用这个EnumMap呢?
因为它的性能高!为什么性能高?
因为它的内部是用数组的数据结构来维护的!我们可以看一下它的源码实现:

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);  
}  

typeCheck是用来检查key的类型的,因为key只能为枚举元素。接下来的这一句int index = key.ordinal();key.ordinal()这个就是我们上面说的枚举类型的序号,然后被当做数组的下标,放到vals这个数组里。那么get方法呢?

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

注意这一句话:vals[((Enum< ? >)key).ordinal()]。这个不就是取得下标,根据下标获取数组中的值吗?!

remove方法

public V remove(Object key) {  
    if (!isValidKey(key))  
        return null;  
    int index = ((Enum<?>)key).ordinal();  
    Object oldValue = vals[index];  
    vals[index] = null;  
    if (oldValue != null)  
        size--;  
    return unmaskNull(oldValue);  
}  

remove方法的实现也是挺简单的,就是把相应下标的元素变为null,等着GC回收。

下面是使用EnumMap的一个例子:

EnumMap<EnumTest01, String> enumMap = new EnumMap<EnumTest01, String>(EnumTest01.class);  
enumMap.put(EnumTest01.DELETE, "dsdsd");  
enumMap.put(EnumTest01.UPDATE, "qqqqqq");  
for (Map.Entry<EnumTest01, String> entry : enumMap.entrySet()) {  
    System.out.println(entry.getValue() + entry.getKey().getEnumDesc());  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值