集合增强

并发修改 ConcurrentModificationException

并发修改 ConcurrentModificationException 错误是开发中一个常见错误,多发生在对一个 Collection 边遍历边做影响 size 变化的操作中,下面以 ArrayList 为例分析 ConcurrentModificationException 错误。

ArrayList 初始数据如下。

1
2
3
4
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

场景 1:不会有并发修改错误

1
2
3
4
5
6
int length = list.size();
for (int i = 0; i < length; i++) {
if (list.get(i).equals(2)) {
list.add(10);
}
}

场景 2:会有并发修改错误

1
2
3
4
5
for(int temp : list) {
if(temp == 2) {
list.add(10);
}
}

场景 3:会有并发修改错误

1
2
3
4
5
6
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()) {
if(iterator.next().equals(2)) {
list.add(10);
}
}

场景 4:没有并发修改问题

1
2
3
4
5
6
ListIterator<Integer> listIterator = list.listIterator();
while (listIterator.hasNext()) {
if (listIterator.next().equals(2)) {
listIterator.add(10);
}
}

其实 ConcurrentModificationException 异常的抛出是由于 checkForComodification(AbstractList 类中)方法的调用引起的。

1
2
3
4
private void checkForComodification() {
if (this.modCount != l.modCount)
throw new ConcurrentModificationException();
}

Java8 中 List 转 Map(Collectors.toMap) 使用技巧

Java8 中 List 转 Map(Collectors.toMap) 使用技巧 | 张振伟的博客 https://zhangzw.com/posts/20191205.html

参考

版权声明:本文为 CSDN 博主「wchicho」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/wchicho/article/details/51987992

ArrayList 的 toArray_weixin_30701575 的博客-CSDN 博客
https://blog.csdn.net/weixin_30701575/article/details/95004084

深入理解 List 的 toArray()方法和 toArray(T[] a)方法_一直在努力的小渣渣-CSDN 博客_toarray
https://blog.csdn.net/mucaoyx/article/details/86005283

Java 中 List 转换为数组,数组转 List - 低调的程序猿 - 博客园
https://www.cnblogs.com/jingnumber/p/7814092.html