сбой быстрого поведения java HashMap

Я поиграл с java.util.HashMap, чтобы узнать, что такое поведение fail-fast.

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

я получил результат

12
11
10
14
13
after modifn
12
11
10
14

Я также пытался использовать итератор

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

В любом случае я не получил ConcurrentModificationException. Это потому, что (из javadoc)

безотказное поведение итератора не может быть гарантировано, поскольку, вообще говоря, невозможно дать какие-либо жесткие гарантии при наличии несинхронизированной параллельной модификации. Отказоустойчивые итераторы выбрасывают ConcurrentModificationException в максимально возможной степени.

Я проверил другую поток, в котором говорится, что он БУДЕТ выкинуть ConcurrentModificationException.. что вы думаете?


person damon    schedule 19.06.2012    source источник
comment
Попробуйте позвонить clear(), а не remove().   -  person Bringer128    schedule 19.06.2012


Ответы (1)


Учитывая вывод, который вы показали:

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

Поскольку 13 является последней парой ключ-значение, когда вы выполняете Iterate через HashMap, а затем, наконец, удаляете ключ-значение, соответствующее stark 13, это останавливает Iteration сразу после изменения HashMap, следовательно, он больше не iterate. Так что нет ConcurrentModificationException.

person Kazekage Gaara    schedule 19.06.2012
comment
спасибо.. Я никогда не замечал, что..if(key.equals("jon")) выдает исключение.. - person damon; 19.06.2012