对于列表,这里以ArrayList进行举例说明,下面给出几种经常会遇到的写法
首先初始化一个list数组
List错误写法 foreachlist = new ArrayList<>(); for (int i = 0; i < 20; i++) { list.add(i + ">index"); }
这个属于我们最常见的foreach循环,在循环内部判断满足条件的直接删除
for (String id : list) {
if (id.contains("2")) {
list.remove(id);
}
}
上面这种写法导致的问题,很容易可以发现,因为上面代码跑完之后,堆栈就出来了
很典型的并发修改错误,在foreach循环中不允许删除,新增
for (int index = 0; index < list.size(); index++) {
if (index % 5 == 0) {
list.remove(index);
}
}
System.out.println(list);
上面这种写法,我们希望把列表中,第0,5,10,15位置的元素干掉,正常执行,倒是不会报错,然而输出的结果却和我们的预期不一致
for循环中,另外一种写法可能更加常见,为了避免每次都访问 list.size() 方法,我可能提前用一个变量保存数组大小
int size = list.size();
for (int index = 0; index < size; index++) {
if (index % 5 == 0) {
list.remove(index);
} else {
System.out.print(list.get(index));
}
}
上面这个问题就很明显了,数组越界
正确写法 迭代方式Iteratorjdk8+ 流方式iterator = list.iterator(); while (iterator.hasNext()) { String tmp = iterator.next(); if (tmp.contains("2")) { iterator.remove(); } }
list.removeIf(s -> s.contains("3"));



