Java中的EnumMap集合解析
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 Boot 配置 Hikari 数据库连接池的操作代码
数据库连接池是一个提高程序与数据库的连接的优化,连接池它主要作用是提高性能、节省资源、控制连接数、连接管理等操作,这篇文章主要介绍了SpringBoot配置Hikari数据库连接池,需要的朋友可以参考下2023-09-09
SpringMVC中controller接收json数据的方法
这篇文章主要为大家详细介绍了SpringMVC中controller接收json数据的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-09-09
Intellij IDEA实现SpringBoot项目多端口启动的两种方法
有时候使用springboot项目时遇到这样一种情况,用一个项目需要复制很多遍进行测试,除了端口号不同以外,没有任何不同。遇到这种情况怎么办呢?这时候可以使用Intellij IDEA解决2018-06-06
SpringBoot中@ConfigurationProperties注解实现配置绑定的三种方法
这篇文章主要介绍了SpringBoot中@ConfigurationProperties注解实现配置绑定的三种方法,文章内容介绍详细需要的小伙伴可以参考一下2022-04-04


最新评论