Iterator迭代器:
当使用迭代器遍历元素,并删除元素时,要使用迭代器内部的remove, 不能使用集合对象的remove.
@Test
public void testIteratorError(){
Map<String,String> map = new HashMap<>();
map.put("k1","v1");
map.put("k2","v2");
map.put("k3","v3");
map.put("k4","v4");
map.put("k5","v5");
Collection<String> collection = map.values();
//增强型for循环. 内部使用的是Iterator进行迭代.
for (String s : collection) {
if(s == "v2"){
//使用集合的remove方法
//抛出异常: java.util.ConcurrentModificationException
collection.remove(s);
}
}
System.out.println(collection);
}
因为迭代器在删除元素时还要更新迭代器中cursor的值, 如果使用集合对象的remove,那么在使用迭代器遍历时会少遍历一些元素, 所以为了防止这种情况的发生, JDK使用了modCount来计数. 当使用迭代器.remove时会判断,是否modCount == expectedModCount, 如果相等说明没有调用过集合对象的remove方法, 如果不等就说明调用了集合对象的remove,这时再使用迭代器遍历元素时会报异常[ConcurrentModificationException].
所以应该使用迭代器内部的remove
@Test
public void testIterator(){
Map<String,String> map = new HashMap<>();
map.put("k1","v1");
map.put("k2","v2");
map.put("k3","v3");
map.put("k4","v4");
map.put("k5","v5");
Collection<String> collection = map.values();
//获得迭代器
Iterator<String> iter = collection.iterator();
while(iter.hasNext()){
String s = iter.next();
if (s == "v2") {
//使用迭代器内的remove方法.
iter.remove();
}
}
System.out.println(collection);
}