2017-05-27 241 views
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获得什么样的好处。

回答

4

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

if (oldValue == null) 
    size++; 

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

+1

为了扩大这一点 - 这是事实的结果,因为键是Enums,值存储区是已知大小的预分配数组 - 所有可能的键都直接映射到值,没有桶和什么都不会碰撞。需要标记值以便可以将空值元素与插入显式空值的元素区分开来。 – pvg

+1

为了扩展_that_,null元素用于空元素,NULL元素用于null元素(反之亦然),因为这样,新分配的数组立即代表空映射。 –

相关问题