为什么EnumMap为空值分配Object类对象?
问题描述:
我正在研究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获得什么样的好处。
答
它允许区分从未添加到地图的键和添加了null
值的键。你甚至可以在你所引用的代码中看到这一点:
if (oldValue == null)
size++;
如果null
以前被放置到这个关键的地图,oldValue
将NULL
和大小将不会被改变。
为了扩大这一点 - 这是事实的结果,因为键是Enums,值存储区是已知大小的预分配数组 - 所有可能的键都直接映射到值,没有桶和什么都不会碰撞。需要标记值以便可以将空值元素与插入显式空值的元素区分开来。 – pvg
为了扩展_that_,null元素用于空元素,NULL元素用于null元素(反之亦然),因为这样,新分配的数组立即代表空映射。 –