【问题标题】:Why EnumMap assign a Object class object for null values?为什么 EnumMap 为空值分配一个 Object 类对象?
【发布时间】:2017-05-27 17:00:03
【问题描述】:

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

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";
            }
   };

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

【问题讨论】:

    标签: java enum-map


    【解决方案1】:

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

    if (oldValue == null)
        size++;
    

    如果 null 之前使用此键放入地图,oldValue 将是 NULL 并且大小不会改变。

    【讨论】:

    • 稍微扩展一下——这是因为键是枚举,值存储是一个已知大小的预分配数组——所有可能的键都直接映射到值,没有水桶,没有任何东西可以碰撞。需要一个标记值,以便可以将空值元素与插入显式 null 的元素区分开来。
    • 为了扩展 null 用于空元素,NULL 用于 null 元素(而不是相反),因为这样,新分配数组立即表示一个空地图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多