`

读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类的使用。

    java集合-EnumMap的使用

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

    28个java常用的工具类源码

    16. **EnumSet和EnumMap**:针对枚举类型的特殊集合实现,效率较高。 17. **ConcurrentHashMap**:线程安全的哈希表,是高并发场景下的常用数据结构。 18. **CountDownLatch和CyclicBarrier**:同步原语,用于多...

    一文弄懂EnumMap和EnumSet

    【EnumMap和EnumSet详解】 在Java编程中,当我们需要处理特定枚举类型(Enum)作为键(Key)的映射关系时,EnumMap和EnumSet成为两种非常实用的工具类。它们是Java集合框架中专门为枚举类型设计的高效容器,提供了...

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

    为了解决这些问题,Java提供了一个特定的Map实现——`java.util.EnumMap`,它专为枚举设计,提供更高的类型安全性和性能。 首先,让我们深入理解枚举和`ordinal()`方法。枚举类型定义了一系列相关的常量,例如`Herb...

    jdk1.8源码

    JDK1.8为`EnumSet`和`EnumMap`增加了新的静态工厂方法,使得创建枚举集合更加方便。 十、动态类型语言支持 JDK1.8增加了对动态类型语言的支持,如GraalVM,使得Java可以更好地与其他动态语言交互。 以上只是JDK1.8...

    Java 中的 EnumMap putAll(map) 方法

    Java 中的 Java.util.EnumMap.putAll(map) 方法用于将所有映射从一个映射复制到另一个较新的映射。较旧的映射将替换为较新的映射。

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

    这篇博客将深入探讨Java枚举的特性和使用方法,包括`EnumSet`和`EnumMap`这两个与枚举相关的数据结构。 首先,枚举定义的基本语法是`public enum EnumName {constant1, constant2, ...}`。每个枚举常量都是`...

    2021年EFFECTIVEJAVA读书笔记.docx

    本文总结了Effective Java 中关于枚举与注解的知识点,涵盖了枚举类型的优点、使用指南、避免使用 int 常量、使用 EnumSet 和 EnumMap 等。 枚举类型的优点 枚举类型提供了编译时类型安全、自动命名空间隔离、可以...

    Java Collections 技术研讨会资料+(带源码)

    还有EnumSet和EnumMap,专门为枚举类型设计的高效集合实现。 在本次研讨会的实例代码中,你将看到如何创建、遍历、修改和操作这些集合的示例。这些代码涵盖了基本操作、性能测试、并发控制等方面,帮助你更好地理解...

    thinkinjava4源码-Thinking-In-Java4e:java编程思想第4版

    同时,注解在枚举中也有应用,如EnumSet和EnumMap。 通过这个源码包,你可以跟随《Thinking in Java》第四版的章节,逐个探索和实践每一个主题,加深对Java编程的理解,提升编程技能。同时,这也是一个很好的自我...

    jdk7:查看JDK7原始码使用的项目-看

    6. **改进的枚举类型**:JDK7增强了枚举类型的功能,比如`java.util.EnumSet`和`java.util.EnumMap`的优化,提供了高效的集合操作。 7. **开关表达式**:虽然开关表达式(switch-on-string)在JDK7中并未完全实现,...

    Java中常用Map测试示例

    本示例将深入探讨Java中常用的`Map`实现,包括`HashMap`和`EnumMap`。 首先,`Map`接口定义了一些基本操作,如`put`用于添加键值对,`get`用于获取与给定键关联的值,`remove`用于移除键值对,以及`size`用于返回...

    MAP的讲解利用

    `通过key删除,`enumMap.erase(enumMap.begin(), enumMap.end());`清空整个map。 7. **swap操作** map的`swap()`函数并不交换容器内的元素,而是交换两个map容器的所有内容,即交换它们的内部结构和元素。例如: ...

    Collections源码java-RockBottom:2D侧滚动资源收集游戏-现在开源!

    《Collections源码解析:以Java实现的2D侧滚动资源收集游戏RockBottom》 在Java编程领域,理解并深入研究源代码是提升技术能力的重要途径。本文将针对标题中的"Collections源码java-RockBottom:2D侧滚动资源收集...

    C++_map的基本操作和使用

    clear() 就相当于 `enumMap.erase(enumMap.begin(), enumMap.end());` Map 的其他操作 Map 还提供了许多其他的操作,例如反转 Map、合并两个 Map、将 Map 转换为其他容器等。这些操作可以根据实际情况选择使用。 ...

    jdk1.6源代码

    2. **枚举类型(Enum)的改进**:新增了`EnumSet`和`EnumMap`类,这两个类专门用于枚举类型的集合操作,提供了高效且类型安全的实现。 3. **NIO.2(New I/O 2)**:引入了`java.nio.file`包,提供了新的文件系统API...

    C++ map使用

    如`enumMap.erase(it)`删除迭代器指向的元素,`enumMap.erase(key)`删除指定键的元素,`enumMap.erase(enumMap.begin(), enumMap.end())`清空整个`map`。 **示例代码** ```cpp #include #include #include ...

    Java JDK 7 实例宝典代码

    - `EnumSet`和`EnumMap`的性能得到提升,它们是专门为枚举类型设计的高效集合实现。 - `Collections`类新增了`unmodifiable*`工厂方法,用于创建不可修改的集合视图。 7. **语法糖**: - `_`作为下划线字符,...

Global site tag (gtag.js) - Google Analytics