CH32-EnumMap
EnumMap用于持有key为Enum类型的map,由于枚举类型的特殊性,EnumMap内部直接使用了简单的数组来支持,这使得EnumMap的操作相当高效.
- EnumMap不是线程安全的,并发修改需要用户自己实现线程安全.
- EnumMap没有实现Fail-Fast
EnumMap构造器
EnumMap能够通过指定key类型来初始化一个EnumMap。内部构建了一个数组,用于持有所有的枚举元素:
public EnumMap(Class<K> keyType) {
this.keyType = keyType;
keyUniverse = getKeyUniverse(keyType);
vals = new Object[keyUniverse.length];
}
/**
* Creates an enum map with the same key type as the specified enum
* map, initially containing the same mappings (if any).
*
* @param m the enum map from which to initialize this enum map
* @throws NullPointerException if <tt>m</tt> is null
*/
public EnumMap(EnumMap<K, ? extends V> m) {
keyType = m.keyType;
keyUniverse = m.keyUniverse;
vals = m.vals.clone();
size = m.size;
}
这里的getUniverse()方法可以返回所有的枚举类型值。并且构建数组表示最多可以容纳枚举元素个数那么多的key-value对.
插入,获取,删除修改元素
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的插入,删除都可以i实现的非常高效,直接使用枚举元素的字面值,然后设置对应数组上的值即可.
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 V get(Object key) {
return (isValidKey(key) ?
unmaskNull(vals[((Enum<?>)key).ordinal()]) : null);
}
由于底层直接使用数组,因此,插入,删除,获取的时间都是O(1)的.
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.