Java中的EnumMap集合解析

 更新时间:2023年09月28日 08:50:09   作者:光与热  
这篇文章主要介绍了Java中的EnumMap集合解析,EnumMap是Map接口的一种实现,专门用于枚举类型的键,所有枚举的键必须来自同一个枚举,
EnumMap不允许键为空,允许值为空,需要的朋友可以参考下

EnumMap

EnumMap是Map接口的一种实现,专门用于枚举类型的键,所有枚举的键必须来自同一个枚举

EnumMap不允许键为空,允许值为空

EnumMap成员变量

    private final Class<K> keyType;
    private transient K[] keyUniverse;
    private transient Object[] vals;
    private transient int size = 0;
    private static final Object NULL = new Object() {
    public int hashCode() {
        return 0;
    }
    public String toString() {
        return "java.util.EnumMap.NULL";
    }
};

其中有一个特别的数据类型它是Object实例NULL,用于取代真正的NULL值

下面是几个常用的方法

源码解读

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

EnumMap key必须来自同一个枚举,在向EnumMap存放数据的时候,首先进行类型检查

private void typeCheck(K key) {
    Class<?> keyClass = key.getClass();
    if (keyClass != keyType && keyClass.getSuperclass() != keyType)
        throw new ClassCastException(keyClass + " != " + keyType);
}

然后获取该枚举的索引值以该索引为vals数组的索引存放数据

检查的逻辑是判断当前类和父类是否是指定的枚举类型,如果不是会抛出ClassCastException 类型检查之后,存放数据,数据的存放在EnumMap中对null型数据有额外的操作

private Object maskNull(Object value) {
    return (value == null ? NULL : value);
}
@SuppressWarnings("unchecked")
private V unmaskNull(Object value) {
    return (V)(value == NULL ? null : value);
}

如果存放null值,EnumMap会将其替换成一个重写了toString和hashcode的Object 如下代码所示

private static final Object NULL = new Object() {
    public int hashCode() {
        return 0;
    }
    public String toString() {
        return "java.util.EnumMap.NULL";
    }
};

取数据的时候如果是上面的NULL,那么进行unmask操作

get

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

get方法很简单,首先判断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的类型或者key的父类型是否与指定的EnumMap的键值类型相同

然后判断vals中的值是否为NULL,如果是进行unmask转换

到此这篇关于Java中的EnumMap集合解析的文章就介绍到这了,更多相关Java的EnumMap内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring无法引入注解及import org.springframework.web.bind.annotation.*报错的解决

    spring无法引入注解及import org.springframework.web.bind.annota

    本文主要介绍了spring无法引入注解及import org.springframework.web.bind.annotation.*报错的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Mybatis3中方法返回生成的主键:XML,@SelectKey,@Options详解

    Mybatis3中方法返回生成的主键:XML,@SelectKey,@Options详解

    这篇文章主要介绍了Mybatis3中方法返回生成的主键:XML,@SelectKey,@Options,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Spring注入值到Bean的三种方式

    Spring注入值到Bean的三种方式

    这篇文章主要为大家详细介绍了Spring注入值到Bean的三种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Java中Array List与Linked List的实现分析

    Java中Array List与Linked List的实现分析

    这篇文章主要给大家介绍了关于Array List与Linked List实现的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • java格式化数字操作 NumberFormat及DecimalFormat

    java格式化数字操作 NumberFormat及DecimalFormat

    这篇文章主要介绍了java格式化数字操作 NumberFormat及DecimalFormat,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java棋类游戏实践之中国象棋

    Java棋类游戏实践之中国象棋

    这篇文章主要为大家详细介绍了Java棋类游戏中的中国象棋实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Java中时间戳和时间的转换方法代码

    Java中时间戳和时间的转换方法代码

    这篇文章主要介绍了Java中时间戳和时间的转换的相关资料,Java8中时间戳与日期时间对象之间的转换是编程中常见的操作,通过时间字符串获取时间对象也是其中的一种方法,需要的朋友可以参考下
    2025-03-03
  • Spring Cloud服务入口Gateway的介绍和使用问题小结

    Spring Cloud服务入口Gateway的介绍和使用问题小结

    Spring Cloud Gateway是Spring Cloud的⼀个全新的API⽹关项⽬, 基于Spring + SpringBoot等技术开发, ⽬的是为了替换掉Zuul,这篇文章主要介绍了Spring Cloud服务入口Gateway的介绍和使用问题小结,需要的朋友可以参考下
    2025-03-03
  • SpringMVC访问controller报错404的解决办法(总结超详细)

    SpringMVC访问controller报错404的解决办法(总结超详细)

    纯注解配置SpringMVC程序,使用tomcat8.5.95版本启动,能启动成功并且访问index.jsp页面,但是访问/save时出现404无法访问,本文给大家介绍了SpringMVC访问controller报错404的解决办法,文章总结的非常详细,需要的朋友可以参考下
    2024-05-05
  • 利用spring boot如何快速启动一个web项目详解

    利用spring boot如何快速启动一个web项目详解

    这篇文章主要给大家介绍了关于利用spring boot如何快速启动一个web项目的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧、
    2017-12-12

最新评论