2
我正在研究Java EnumMap實現,並發現如果我將null值傳遞給EnumMap,EnumMap會指派一個Object類對象來代替null值。從EnumMap的類爲什麼EnumMap爲空值分配Object類對象?
代碼:
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);
}
private Object maskNull(Object value) {
return (value == null ? NULL : value);
}
private static final Object NULL = new Object() {
public int hashCode() {
return 0;
}
public String toString() {
return "java.util.EnumMap.NULL";
}
};
我的問題是,爲什麼java的位置,在適當的直接分配一個空值定鍵的對象。 Java獲得什麼樣的好處。
爲了擴大這一點 - 這是事實的結果,因爲鍵是Enums,值存儲區是已知大小的預分配數組 - 所有可能的鍵都直接映射到值,沒有桶和什麼都不會碰撞。需要標記值以便可以將空值元素與插入顯式空值的元素區分開來。 – pvg
爲了擴展_that_,null元素用於空元素,NULL元素用於null元素(反之亦然),因爲這樣,新分配的數組立即代表空映射。 –