为什么 EnumMap 为空值分配一个 Object 类对象?

Ami*_*arg 2 java enum-map

我正在研究 Java EnumMap 实现,发现如果我将空值传递给 EnumMap,EnumMap 会分配一个 Object 类对象来代替空值。

来自 EnumMap 类的代码:

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";
            }
   };
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么 java 放置一个对象而不是直接为给定的键分配空值。java 这样做有什么好处。

Ale*_*nov 6

它允许区分从未添加到地图中的键和添加了null值的键。您甚至可以在引用的代码中看到这一点:

if (oldValue == null)
    size++;
Run Code Online (Sandbox Code Playgroud)

如果null是以前放到这个关键的地图,oldValue会NULL和大小将不会被改变。

  • 稍微扩展一下 - 这是由于键是枚举,所以值存储是一个已知大小的预分配数组 - 所有可能的键都直接映射到值,没有桶,没有任何东西可以冲突. 需要一个标记值,以便可以将空值元素与插入了显式空值的元素区分开来。 (2认同)