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);
}
点击查看更多内容
2人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦