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() != keyType)
throw new ClassCastException(keyClass + " != " + keyType);
}
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);
}
public boolean containsKey(Object key) {
return isValidKey(key) && vals[((Enum<?>)key).ordinal()] != null;
}
public V get(Object key) {
return (isValidKey(key) ?
unmaskNull(vals[((Enum<?>)key).ordinal()]) : null);
}
如果想创建线程安全的EnumMap类,则可以通过如下方式:
// EnumTest 为自己创建的枚举类
Map<EnumTest,String> em = Collections.synchronizedMap(new EnumMap<EnumTest,String>(EnumTest.class) );
特性:
1.线程不安全
2.和HashMap相比,效率要比HashMap高