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() != ke