2012-06-19 17 views
5

Tôi đã phát xung quanh với java.util.HashMap để tìm hiểu xem hành vi của fail-fast là gì.không hoạt động nhanh của 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)); 
} 

tôi đã có kết quả

12 
11 
10 
14 
13 
after modifn 
12 
11 
10 
14 

Tôi cũng đã cố gắng sử dụng một iterator

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

tôi không nhận được bất kỳ ConcurrentModificationException trong cả hai trường hợp ..Is này vì (từ javadoc)

hành vi không nhanh của một lần lặp tor không thể được đảm bảo như nó là, nói chung, không thể thực hiện bất kỳ đảm bảo cứng trong sự hiện diện của sửa đổi đồng thời không đồng bộ. Thất bại nhanh lặp ném ConcurrentModificationException trên cơ sở nỗ lực tốt nhất

Tôi đã kiểm tra khác thread mà nói, nó sẽ ném ConcurrentModificationException ..what Bạn nghĩ?

+0

Hãy thử gọi 'clear()' thay vì 'remove()'. – Bringer128

Trả lời

6

Với sản lượng mà bạn đã chỉ ra:

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

Kể từ khi 13 là cặp khóa-giá trị cuối cùng, khi bạn Iterate qua HashMap bạn và sau đó cuối cùng đã loại bỏ các giá trị khóa tương ứng với stark 13, mà dừng Iteration ngay sau khi HashMap đã được sửa đổi, do đó, nó không còn iterate nữa. Vì vậy, không có ConcurrentModificationException.

+0

thanks..Tôi không bao giờ để ý rằng ... 'if (key.equals (" jon "))' sẽ ném ngoại lệ .. – damon