Я создал итератор (), а затем удалил 1-ую запись с карты перед итерацией. Я всегда получаю 1-й предмет, возвращаемый итератором. Но когда я удаляю 2-ю или последующие записи, текущий итератор не возвращает эту запись.
Пример удаления 1-й записи с карты:
Map<Integer,Integer> m1 = new ConcurrentHashMap<>();
m1.put(4, 1);
m1.put(5, 2);
m1.put(6, 3);
Iterator i1 = m1.entrySet().iterator();
m1.remove(4); // remove entry from map
while (i1.hasNext())
System.out.println("value :: "+i1.next()); //still shows entry 4=1
и вывод:
value :: 4=1
value :: 5=2
value :: 6=3
Пример удаления 3-й записи с карты:
Map<Integer,Integer> m1 = new ConcurrentHashMap<>();
m1.put(4, 1);
m1.put(5, 2);
m1.put(6, 3);
Iterator i1 = m1.entrySet().iterator();
m1.remove(6); // remove entry from map
while (i1.hasNext())
System.out.println("value :: "+i1.next()); //does not show entry 6=3
и вывод:
value :: 4=1
value :: 5=2
Почему удаление 1-й записи с карты не отражено в итераторе, но удаление 2-й или последующей записи:?
Документация Java гласит:
Итераторы, Сплитераторы и Перечисления возвращать элементы, отражающие состояние таблицы ha sh в некоторый момент времени или после создания итератора / перечисления. Они не генерируют ConcurrentModificationException.
Это означает, что его итераторы отражают состояние таблицы ha sh в момент создания итератора. И когда мы добавим или удалим запись на или с карты, итератор покажет исходные записи?