51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

避免list中remove导致ConcurrentModificationException

凡不是就着泪水吃过面包的人是不懂得人生之味的人------歌德

我们在list循环中调用remove函数删除自身元素可能会导致java.util.ConcurrentModificationException

例如

|-----------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 | hljs java // 构造从0到20的list List<Integer> list = Stream.iterate(0, i -> ++i).limit(20).collect(Collectors.toList()); // 删除 list.forEach(list::remove); |

首先我们可以使用removeIf代替

|-----------|---------------------------------------------------| | 1 | hljs java list.removeIf(i -> i.equals(i)); |

其次我们可以使用迭代器

我们可以看到removeIf的源码正是使用了迭代器

image-20210305223612389

如下

|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 | hljs java Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { Integer nowNumber = iterator.next(); iterator.remove(); } |

在无法使用removeIf的场景下即可使用Iterator下的remove()方法

赞(1)
未经允许不得转载:工具盒子 » 避免list中remove导致ConcurrentModificationException