`

读EnumMap源码

阅读更多
//一个key是枚举类型的map,速度基本会比hashMap更快
//先看构造函数

//构造指定键类型的EnumMap
public EnumMap(Class<K> keyType) {
        this.keyType = keyType;
	//获取key的枚举值
        keyUniverse = getKeyUniverse(keyType);
        vals = new Object[keyUniverse.length];
    }

public EnumMap(EnumMap<K, ? extends V> m) {
        keyType = m.keyType;
        keyUniverse = m.keyUniverse;
        vals = m.vals.clone();
        size = m.size;
    }

   public EnumMap(Map<K, ? extends V> m) {
        if (m instanceof EnumMap) {
            EnumMap<K, ? extends V> em = (EnumMap<K, ? extends V>) m;
            keyType = em.keyType;
            keyUniverse = em.keyUniverse;
            vals = em.vals.clone();
            size = em.size;
        } else {
            if (m.isEmpty())
                throw new IllegalArgumentException("Specified map is empty");
            //获取key的class类型
            keyType = m.keySet().iterator().next().getDeclaringClass();
            keyUniverse = getKeyUniverse(keyType);
            vals = new Object[keyUniverse.length];
            putAll(m);
        }
    }

//插入值
 public V put(K key, V value) {
        //验证key的class类型
        typeCheck(key);
        //获取枚举的位置
        int index = key.ordinal();
        Object oldValue = vals[index];
        vals[index] = maskNull(value);
        if (oldValue == null)
            size++;
        return unmaskNull(oldValue);
    }

//判断key的class类型
private void typeCheck(K key) {
        Class keyClass = key.getClass();
        if (keyClass != keyType && keyClass.getSuperclass() != keyType)
            throw new ClassCastException(keyClass + " != " + keyType);
    }

//通过key获取值
public V get(Object key) {
        return (isValidKey(key) ?
                unmaskNull(vals[((Enum)key).ordinal()]) : null);
    }

//校验key
private boolean isValidKey(Object key) {
        if (key == null)
            return false;

        // Cheaper than instanceof Enum followed by getDeclaringClass
        Class keyClass = key.getClass();
        return keyClass == keyType || keyClass.getSuperclass() == keyType;
    }

//根据key删除值
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);
    }

//删除映射
private boolean removeMapping(Object key, Object value) {
        if (!isValidKey(key))
            return false;
        int index = ((Enum)key).ordinal();
        if (maskNull(value).equals(vals[index])) {
            vals[index] = null;
            size--;
            return true;
        }
        return false;
    }

//返回集合长度
 public int size() {
        return size;
    }

//是否包含某个key
public boolean containsKey(Object key) {
        return isValidKey(key) && vals[((Enum)key).ordinal()] != null;
    }

//是否包含某个值
 public boolean containsValue(Object value) {
        value = maskNull(value);

        for (Object val : vals)
            if (value.equals(val))
                return true;

        return false;
    }

//清空
public void clear() {
        Arrays.fill(vals, null);
        size = 0;
    }

//添加所有的
public void putAll(Map<? extends K, ? extends V> m) {
        if (m instanceof EnumMap) {
            EnumMap<? extends K, ? extends V> em =
                (EnumMap<? extends K, ? extends V>)m;
            if (em.keyType != keyType) {
                if (em.isEmpty())
                    return;
                throw new ClassCastException(em.keyType + " != " + keyType);
            }

            for (int i = 0; i < keyUniverse.length; i++) {
                Object emValue = em.vals[i];
                if (emValue != null) {
                    if (vals[i] == null)
                        size++;
                    vals[i] = emValue;
                }
            }
        } else {
            super.putAll(m);
        }
    }


分享到:
评论

相关推荐

    java Enum EnumMap 简单例子

    简单查询算法,供学习参考。 代码中描述了Enum和EnumMap类的使用。

    一文弄懂EnumMap和EnumSet

    文章目录简介EnumMap什么时候使用EnumMapEnumSet总结 一文弄懂EnumMap和EnumSet 简介 一般来说我们会选择使用HashMap来存储key-value格式的数据,考虑这样的特殊情况,一个HashMap的key都来自于一个Enum类,这样的...

    java集合-EnumMap的使用

    EnumMap是Java中的一种特殊映射实现,它要求键必须来自枚举类型,并且对于每个可能的键值,都有预定义的条目。

    Java中EnumMap代替序数索引代码详解

    主要介绍了Java中EnumMap代替序数索引代码详解,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    说说Java中的枚举 转 可以了,够了 包括EnumSet(Map)

    NULL 博文链接:https://mlaaalm.iteye.com/blog/694720

    Java中常用Map测试示例

    Java中常用Map测试示例 包含 Map HashMap EnumMap等等

    高级编程-java实验报告.docx

    实验目的及要求 1) 掌握Java集合框架的概念以及几种具体实现:ArrayList, LinkedList, HashSet, TreeSet, PriorityQueue; 2) 掌握Java集合框架的映射的概念以及映射的...3)枚举类型的使用,EnumSet和EnumMap的使用;

    使用数组存储值的枚举的优化映射实现。-Rust开发

    #[derive(Debug,EnumMap)]枚举示例{A,B,C,} fn main(){让mut map = enum_map! {示例:: A =&gt; 1,示例:: B =&gt; 2,示例:: C =&gt; 3,}; map [Example :: C] = 4; assert_eq!(map [Example :: A],1);

    Java期末复习——枚举与反射机制

    Java——枚举: enum关键字、Enum类 类集对枚举的支持——EnumMap类与EnumSet类 枚举类实现接口、在枚举类中定义抽象方法 Java反射机制: Class类、Class类的使用 反射的应用:取得类的结构

    廖雪峰 Java 教程.doc

    使用EnumMap 使用TreeMap 使用Properties 使用Set 使用Queue 使用PriorityQueue 使用Deque 使用Stack 使用Iterator 使用Collections IO File对象 InputStream OutputStream Filter模式 操作Zip 读取...

    Java枚举(深刻而不深沉平淡而不平庸)

    1.枚举概述 2.枚举的常用方法 3.枚举的特性 4.... 5.Switch状态机,组织枚举,策略枚举 6.EnumSet和EnumMap 原创文章 56获赞 82访问量 5515 关注 私信 展开阅读全文 作者:陌路逢君 唯图一笑

    Effective Java 3rd edition(Effective Java第三版英文原版)附第二版

    Item 37: Use EnumMap instead of ordinal indexing Item 38: Emulate extensible enums with interfaces Item 39: Prefer annotations to naming patterns Item 40: Consistently use the Override annotation Item...

    疯狂JAVA讲义

    7.6.5 EnumMap实现类 281 7.7 HashSet和HashMap的性能选项 282 7.8 操作集合的工具类:Collections 283 7.8.1 排序操作 283 7.8.2 查找,替换操作 287 7.8.3 同步控制 288 7.8.4 设置不可变集合 288 7.9 烦琐...

    Thinking in Java 4th Edition

    What’s Inside Preface 1 Java SE5 and SE6 .................. 2 Java SE6 ............................................The 4th edition...........................Changes ...........................................

Global site tag (gtag.js) - Google Analytics