2017-05-27 240 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元素(反之亦然),因爲這樣,新分配的數組立即代表空映射。 –

相關問題