2013-07-16 12 views
8

Ho una HashMap. I loop attraverso la mappa in questo modo:È sicuro modificare una chiave/valore HashMap durante l'iterazione?

Map<Long, Integer> map = new HashMap<Long, Integer>(); 
for (Long key : map.keySet()) { 
    int value = map.get(key); 
    value--; 
    map.put(key, value); 
} 

Il modo in cui sto utilizzando per aggiornare la mappa è sicuro? Sicuro, nel senso che non danneggia la mappa a causa dell'iterazione.

risposta

2

È un'operazione perfettamente sicura che si sta eseguendo poiché si sta solo cambiando il valore di una chiave esistente nella mappa.

Tuttavia, se si desidera eliminare una voce dalla mappa, ricordare di utilizzare Iterator.

7

Come si può vedere nel HashMap source code, il metodo put modifica solo lo modCount quando viene fornita una nuova chiave. modCount viene utilizzato dall'iteratore per verificare le modifiche e, se tale modifica si verifica tra due chiamate a un iteratore next(), viene generato un valore ConcurrentModificationException. Ciò significa che il modo in cui si utilizza put è sicuro.

8

si potrebbe considerare la scrittura del codice più efficiente:

Map<Long, Integer> map = new HashMap<Long, Integer>(); 
for (Entry<Long, Integer> entry : map.entrySet()) { 
    entry.setValue(entry.getValue() - 1); 
} 

Si tratta di un micro-ottimizzazione, ma a volte le cose, e non si perde nulla. È più breve e chiarisce ogni ambiguità sulla sicurezza dell'avvio!

+0

questo è troppo codice, non lo so ma lo trovo brutto: / –

Problemi correlati