2012-06-19 22 views
5

java HashMap hızlı davranışını başarısız.Ben <code>fail-fast</code> davranış ne olduğunu öğrenmek için <code>java.util.HashMap</code> etrafında oynanan

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)); 
} 

Ben

12 
11 
10 
14 
13 
after modifn 
12 
11 
10 
14 

Ben de her iki durumda da herhangi ConcurrentModificationException alamadım bu bir yineleyici

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

..Is kullanarak çalıştı sonucu aldığım çünkü (javadoc itibaren)

bir ITERA ait başarısız hızlı davranış tor olduğu gibi genel olarak konuşursak , imkansız Eşitlenmemiş eşzamanlı değişiklik varlığında herhangi bir sabit teminat yapmak için garanti edilemez. Fail-hızlı yineleyiciler Ben, bu ..what sizce ConcurrentModificationException atmak OLACAK diyor başka thread kontrol bir en iyisi esasına

üzerine ConcurrentModificationException atmak? Eğer göstermiştir çıktı Verilen

+0

aramayı deneyin 'ziyade kaldırmak' den() 'berrak()'. – Bringer128

cevap

6

: 13 yana

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

son anahtar-değer çifti ise, kendi HashMap aracılığıyla Iterate ve sonra nihayet stark 13 karşılık gelen anahtar değerini kaldırın durur HashMap değiştirildi hemen sonra Iteration dolayısıyla değil iterate artık yok. Yani ConcurrentModificationException.

+0

thanks..I 'istisna durumu that..'if (("Jon") key.equals) hiç fark .. – damon