2012-06-19 14 views
5

He jugado con java.util.HashMap para conocer el comportamiento de fail-fast.comportamiento fallido de 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)); 
} 

me dieron el resultado

12 
11 
10 
14 
13 
after modifn 
12 
11 
10 
14 

También he intentado usar un iterador

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

No he tenido ningún ConcurrentModificationException en cualquiera de los casos esto porque ..es (de javadoc)

el comportamiento a prueba de fallas de un itera no se puede garantizar como es, en general, es imposible hacer ninguna garantía dura en la presencia de de modificación concurrente no sincronizada. Fail-fast iteradores tiran ConcurrentModificationException sobre una base de mejor esfuerzo

he comprobado otra thread que dice, arrojará ConcurrentModificationException ..what qué te parece?

+0

Intenta llamar a 'clear()' en vez de 'remove()'. – Bringer128

Respuesta

6

Dada la salida que ha demostrado:

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

Dado que 13 es el último par clave-valor, cuando Iterate a través de su HashMap y luego retirar finalmente la clave-valor correspondiente a stark 13, que detiene el Iteration justo después de que se haya modificado el HashMap, por lo tanto, ya no se usa iterate. Entonces no ConcurrentModificationException.

+0

gracias ... Nunca he notado que ...'if (key.equals ("jon")) 'arrojará la excepción ... – damon