2015-04-03 55 views
3

枚舉映射在內部表示爲數組。 K [] keyUniverse鍵和Object [] vals數組數組。這些陣列是瞬態的。你能告訴我爲什麼嗎?爲什麼EnumMap內部數組是瞬態的

+0

使用HashMap,檢查枚舉鍵是比理想慢。它不針對枚舉進行優化。 – Prashant 2015-04-03 09:49:47

+0

@Prashant與這個問題無關 - 這就是爲什麼'EnumMap'首先存在的原因。 – 2015-04-03 09:54:25

+0

@AndyTurner:我明白你的觀點,但性能是內部使用數組的主要原因。你可以看看'有效的java by Joshua bloch中的Item 33' – Prashant 2015-04-03 09:59:14

回答

1

它們是暫時的,以允許以不同(更好)方式進行序列化。另外entrySet是暫時的。

private void writeObject(java.io.ObjectOutputStream s) 
    throws java.io.IOException 
{ 
    // Write out the key type and any hidden stuff 
    s.defaultWriteObject(); 

    // Write out size (number of Mappings) 
    s.writeInt(size); 

    // Write out keys and values (alternating) 
    for (Map.Entry<K,V> e : entrySet()) { 
     s.writeObject(e.getKey()); 
     s.writeObject(e.getValue()); 
    } 
} 

private void readObject(java.io.ObjectInputStream s) 
    throws java.io.IOException, ClassNotFoundException 
{ 
    // Read in the key type and any hidden stuff 
    s.defaultReadObject(); 

    keyUniverse = getKeyUniverse(keyType); 
    vals = new Object[keyUniverse.length]; 

    // Read in size (number of Mappings) 
    int size = s.readInt(); 

    // Read the keys and values, and put the mappings in the HashMap 
    for (int i = 0; i < size; i++) { 
     K key = (K) s.readObject(); 
     V value = (V) s.readObject(); 
     put(key, value); 
    } 
} 
+0

哦。我明白了,謝謝! =) – xCroNic 2015-04-03 10:09:42

+2

不知道它是否100%正確。注意到這些字段的「(Cached for performance。)」評論?通常情況下,序列化重複信息根本沒有意義,所以我想這可能是原因:它們可以從非瞬態字段計算。 – Marvin 2015-04-03 10:13:44

+0

@Marvin,EnumMap沒有其他數據字段。 keyUniverse只是相關Enum的所有Enum值的一個數組。它可以隨時從Enum中讀取,但是字段更快。我認爲這個評論「(Cached for performance。)」意思是這個 – xCroNic 2015-04-03 10:22:11

相關問題