public class EnumMap {
// 存放value的是数组,这点类似List,但更具可读性
private transient Object[] vals;
public EnumMap(Class<K> keyType) {
this.keyType = keyType;
keyUniverse = getKeyUniverse(keyType);
// vals数组的容量就是枚举的数量
vals = new Object[keyUniverse.length];
}
public V put(K key, V value) {
typeCheck(key);
// 枚举的ordinal作为value数组的检索下标
int index = key.ordinal();
Object oldValue = vals[index];
vals[index] = maskNull(value);
if (oldValue == null)
size++;
return unmaskNull(oldValue);
}
// 为啥用Object而不用泛型K
// 因为如果K定义成 ?extends XXXEnum, 那么是没法传入参数了,无论是 XXXEnum的子类还是XXXEnum
// 具体原因可以参考 http://blog.csdn.net/hengyunabc/article/details/7696432
// PS:类似Animal接口List<Animal> 和 实现类List<Dog>,不是父子关系的,只有List<? extends Animal>才行
// 具体参考 https://stackoverflow.com/questions/2575363/generics-list-extends-animal-is-same-as-listanimal
public V get(Object key) {
// 需要先校验key的类型,没法定义成泛型,原因如上,只能做检查
return (isValidKey(key) ?
unmaskNull(vals[((Enum<?>)key).ordinal()]) : null);
}
}
EnumMap小抄
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- vue.js推荐使用的扩展名为vue的组件模板,可以让标签的属性和内容都变得动态,这是很强大也很已用的能力。但是,...