2015-04-03 3 views
3

Карты Enum представлены внутри как массивы. K [] keyUniverse массив ключей и Object [] vals массив значений. Эти массивы являются временными. Можешь мне сказать почему?Почему внутренние массивы EnumMap являются переходными

+0

С помощью HashMap проверка ключей перечисления медленнее, чем идеальна. Он не оптимизирован для перечислений. – Prashant

+0

@Prashant, который не имеет отношения к этому вопросу - вот почему 'EnumMap' существует в первую очередь. –

+0

@ AndyTurner: Я получил вашу точку, но производительность была основной причиной использования массивов внутри. вы можете взглянуть на пункт 33 в «Эффективной java от Joshua bloch» – Prashant

ответ

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

Oh. теперь я вижу, спасибо! =) – xCroNic

+2

Не уверен, что он на 100% прав. Отметьте комментарий «(Cached for performance.)» Для этих полей? Обычно просто не имеет смысла сериализовать дублируемую информацию, поэтому я предполагаю, что это могло быть причиной: они могут быть рассчитаны из непереходных полей. – Marvin

+0

@Marvin, EnumMap не имеет других полей данных. keyUniverse - это всего лишь массив всех значений Enum соответствующего Enum. Его можно прочитать из этого Enum в любое время, но с полем быстрее. Я думаю, что комментарий «(Cached for performance.)» Означает это – xCroNic

Смежные вопросы