EnumMap 分析

本文介绍了EnumMap的线程不安全性质,并提及通过特定方式创建线程安全的EnumMap。EnumMap在性能上优于HashMap。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EnumMap(线程不安全):

   // 声明时首先会再内部根据传入的枚举类型的属性长度,创建等长的数组
   public EnumMap(Class<K> keyType) {
        this.keyType = keyType;
        keyUniverse = getKeyUniverse(keyType);
        vals = new Object[keyUniverse.length];
    }
    public V put(K key, V value) {
        typeCheck(key); // 首先进行类型检查

        int index = key.ordinal(); // 获取枚举类型的ordinal值,直接放到数组的对应index位置
        Object oldValue = vals[index];
        vals[index] = maskNull(value);
        if (oldValue == null)
            size++;
        return unmaskNull(oldValue);
    }
    
    /**
     * 进行类型检查,如果不是添加的key的类型和声明时的类型不一致,抛出类型不一致异常
     * 如果添加的key为null,则抛出NPE;
     */
    private void typeCheck(K key) {
        Class<?> keyClass = key.getClass();
        if (keyClass != keyType && keyClass.getSuperclass() != keyType)
            throw new ClassCastException(keyClass + " != " + keyType);
    }
    
    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);
    }

    public boolean containsKey(Object key) {
        return isValidKey(key) && vals[((Enum<?>)key).ordinal()] != null;
    }

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

如果想创建线程安全的EnumMap类,则可以通过如下方式:

// EnumTest 为自己创建的枚举类
Map<EnumTest,String> em = Collections.synchronizedMap(new EnumMap<EnumTest,String>(EnumTest.class) );

 

 特性:

1.线程不安全

2.和HashMap相比,效率要比HashMap高

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值