不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator
方式,如果并发操作,需要对 Iterator 对象加锁。
正例:1
2
3
4
5
6
7Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (删除元素的条件) {
iterator.remove();
}
}
反例:1
2
3
4
5
6
7
8List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
for (String item : list) {
if ("1".equals(item)) {
list.remove(item);
}
}
说明:以上代码的执行结果肯定会出乎大家的意料,那么试一下把“1”换成“2”,会是同样的
结果吗?
执行后“1”是正常 换成2后抛出ConcurrentModificationException异常
ArrayList 的内部类 Itr 实现了 Iterator 接口 其中checkForComodification回判断集合的实际结构变化次数 和 Itr 记录的变化次数,不相等时,则抛出 ConcurrentModificationException 异常
(参考)[https://www.jianshu.com/p/724f763fd242]
JavaScript
数组遍历
foreach 无返回
map 返回相同长度的数组
filter 返回符合条件的数组
reduce 折叠数组