我是靠谱客的博主 会撒娇棒棒糖,最近开发中收集的这篇文章主要介绍java使用for each或迭代器遍历容器(如List)并执行remove操作时出现错误问题描述原因分析解决方案总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

问题描述

1. for each中用remove删除元素

使用for each遍历容器(如List)并执行remove操作时,运行时报错。

public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
System.out.println(list);
for(int i : list){
if (i == 1){
list.remove(i);
}
}
System.out.println(list);
}

在这里插入图片描述
2. 迭代器用remove删除元素

使用迭代器遍历容器(如List)并执行remove操作时,运行结果与预期不符。

public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list);
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()){
Integer i = iter.next();
if(i > 0){
list.remove(i);
}
}
System.out.println(list);
}

虽然会和上面那个报错相同,这是由于快速失败(fail-fast)策略导致的,不妨分析若强制运行下去,会发现最终列表是[2]而不是[]。


原因分析

  1. 调用list.remove()方法导致modCount和expectedModCount的值不一致

详细过程有很多博客已经讲的很清楚了,不再赘述。

  1. MyIterator内部维护着一个index变量用于标记正在遍历到的下标,list中删除元素后,下标变化,故遍历出错。原理同下:
    1
    2

解决方案

  1. 不要用增强的for循环,而老老实实按照下标遍历
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
System.out.println(list);
int size = list.size(); // 防止删除同时list在同时改变大小
for(int i = 0; i < size; i++){
if (list.get(i) == 1){
list.remove(i);
}
}
System.out.println(list);
}
  1. 不要用list.remove,而用迭代器的iter.remove
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list);
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()){
Integer i = iter.next();
if(i > 0){
iter.remove();
}
}
System.out.println(list);
}

总结

尽可能用迭代器来遍历,并使用迭代器的remove方法来删除元素。

最后

以上就是会撒娇棒棒糖为你收集整理的java使用for each或迭代器遍历容器(如List)并执行remove操作时出现错误问题描述原因分析解决方案总结的全部内容,希望文章能够帮你解决java使用for each或迭代器遍历容器(如List)并执行remove操作时出现错误问题描述原因分析解决方案总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部