本文共 4035 字,大约阅读时间需要 13 分钟。
private Object maskNull(Object value) { return (value == null ? NULL : value); //null变NULL,避免内部空指针异常 }
private V unmaskNull(Object value) { return (V)(value == NULL ? null : value); }
private static final Object NULL = new Object() { public int hashCode() { return 0; } public String toString() { return "java.util.EnumMap.NULL"; } };
public V put(K key, V value) { typeCheck(key); // key必须是keyType类型或keyType子类型,否则ClassCastException异常 int index = key.ordinal(); // 以key的ordinal作为数组下标 Object oldValue = vals[index]; vals[index] = maskNull(value); //maskNull: value为空则返回自定义的空对象NULL if (oldValue == null) size++; return unmaskNull(oldValue); //返回oldValue或null
}3、get
public V get(Object key) { return (isValidKey(key) ? unmaskNull(vals[((Enum )key).ordinal()]) : null); }
private boolean isValidKey(Object key) { // 检验key的有效性(不为null且类型合法) if (key == null) return false; // Cheaper than instanceof Enum followed by getDeclaringClass Class keyClass = key.getClass(); return keyClass == keyType || keyClass.getSuperclass() == keyType; }
get方法先检验key的有效性,有效则以ordinal为下标返回vals[ordinal],否则返回null,So,和HashMap一样,不可以用get来判断EnumMap是否包含某一元素,因为某元素的value可能本就为null。4、contains相关
public boolean containsKey(Object key) { return isValidKey(key) && vals[((Enum )key).ordinal()] != null; }注意containsKey和get的区别(仅仅未调用unmaskNull方法),以及EnumMap自定义的NULL和null的区别。
public boolean containsValue(Object value) { value = maskNull(value); //null则返回NULL,否则返回value本身 for (Object val : vals) // 遍历vals if (value.equals(val)) return true; // 只要有一个相等即返回true return false; }
private boolean containsMapping(Object key, Object value) { return isValidKey(key) && maskNull(value).equals(vals[((Enum )key).ordinal()]); }
// containsMapping方法是私有的,仅供EntrySet的contains方法调用。
// 遍历KeySet
Set keySet = enumMap.keySet();
terator iteKey = keySet.iterator();
while(iteKey.hasNext()){
Object object =(Object) iteKey.next();
System.out.print(object +"="+ enumMap.get(object)+"; ");
}
------------------
// 遍历values
Collection<Object> vals = enumMap.values();
Iterator iteVal = vals.iterator();
while(iteVal.hasNext()){
Object object =(Object) iteVal.next();
System.out.print(object +"; ");
// ((Iterator) object).remove();// ClassCastException: String cannot be cast to Iterator
}
--------------------
// 遍历Entry
Set<Entry<Season, Object>> entrySet = enumMap.entrySet();
Iterator iteEn = entrySet.iterator();
while(iteEn.hasNext()){
Entry object =(Entry) iteEn.next();
System.out.print(object.getKey()+"; ");
iteEn.remove();
}
public voidclear(){
Arrays.fill(vals,null);
size =0;
}
public static void fill(Object[] a, Object val){
for(int i =0, len = a.length; i < len; i++)
a[i]= val; // 逐个遍历,好在vals[]元素也不会有太多
}
public V remove(Object key){
if(!isValidKey(key))
return null;
int index =((Enum<?>)key).ordinal();
Object oldValue = vals[index];
vals[index]=null; // 直接置null
if(oldValue !=null)
size--;
return unmaskNull(oldValue); // 返回oldValue(包含null)
}
转载地址:http://fxbno.baihongyu.com/