2012-06-19 12 views
5

Ho giocato con java.util.HashMap per scoprire il comportamento di fail-fast.errore comportamento veloce di java HashMap

HashMap map = new HashMap(); 
map.put("jon", 10); 
map.put("sean", 11); 
map.put("jim", 12); 
map.put("stark", 13); 
map.put("vic", 14); 
Set keys = map.keySet(); 
for(Object k:keys) { 
    System.out.println(map.get(k)); 
} 

for(Object k:keys) { 
    String key =(String)k; 
    if(key.equals("stark")) { 
     map.remove(key); 
    } 
} 

System.out.println("after modifn"); 
for(Object k:keys) { 
    System.out.println(map.get(k)); 
} 

ho ottenuto il risultato

12 
11 
10 
14 
13 
after modifn 
12 
11 
10 
14 

Ho anche provato ad utilizzare un iteratore

Iterator<String> itr = keys.iterator(); 
while(itr.hasNext()) { 
    String key = itr.next(); 
    if(key.equals("stark")) { 
     map.remove(key); 
    } 
} 

non ho avuto alcun ConcurrentModificationException in entrambi i casi ..è questo perché (da javadoc)

il comportamento fail-fast di un itera non può essere garantito così com'è, in generale, impossibile fornire garanzie rigide nella presenza dello di modifica simultanea non sincronizzata. Fail-fast iteratori gettano ConcurrentModificationException su base best-effort

ho controllato un altro thread che dice, si getterà ConcurrentModificationException ..che ne pensi?

+0

Prova a chiamare 'clear()' piuttosto che 'remove()'. – Bringer128

risposta

6

Dato l'output di aver mostrato:

12 
11 
10 
14 
13 // notice this? 
after modifn 
12 
11 
10 
14 

Poiché 13 è l'ultima coppia valore-chiave, quando si Iterate tramite il HashMap e infine rimuovere il valore-chiave corrispondente a stark 13, che ferma il Iteration subito dopo il HashMap è stato modificato, quindi, non è più iterate. Quindi no ConcurrentModificationException.

+0

grazie..non ho mai notato che ... 'if (key.equals (" jon "))' genererà l'eccezione .. – damon