厦门网站制作建设,成都市建设领域网站咨询电话,百度站长平台网站体检,网站制作视频教程免费首先说结论#xff1a;无论什么场景#xff0c;都不要对List使用for循环的同时#xff0c;删除List集合元素#xff0c;因为这么做就是不对的。
阿里开发手册也明确说明禁止使用foreach删除、增加List元素。 正确删除元素的方式是使用迭代器#xff08;Iterator#xff…首先说结论无论什么场景都不要对List使用for循环的同时删除List集合元素因为这么做就是不对的。
阿里开发手册也明确说明禁止使用foreach删除、增加List元素。 正确删除元素的方式是使用迭代器Iterator代码如下
ListString list new ArrayList();
IteratorString iterator list.iterator();
while (iterator.hasNext()) {// 删除元素iterator.remove();
}JDK8后lambda写法
list.removeIf(s - s.contains(a));不想知道为什么不能使用for循环删除List集合元素的看完前言就可以关闭本页面了想知道原因的继续往下看
下面举个实例场景看一下为什么不能使用for循环。
需求 一个List集合元素类型为String有N个元素删除这些元素中包含字符’‘a’的元素。
假设集合内容如下
ListString list new ArrayList(4);
list.add(a);
list.add(ab);
list.add(abc);
list.add(abcd);public static void main(String[] args) {ListString list new ArrayList(4);list.add(a);list.add(ab);list.add(abc);list.add(abcd);IteratorString iterator list.iterator();while (iterator.hasNext()) {if (iterator.next().contains(a)) {// 删除元素iterator.remove();}}System.out.println(list);
}输出结果为
[]错误答案1普通for循环for-i
public static void main(String[] args) {ListString list new ArrayList(4);list.add(a);list.add(ab);list.add(abc);list.add(abcd);for (int i 0; i list.size(); i) {if (list.get(i).contains(a)) {list.remove(i);}}System.out.println(list);
}输出结果为
[ab, abcd]分析 普通for循环遍历List集合的同时删除List中的元素是可以运行的代码但在大多数场景下不能使用这种方式上边的结果也印证了这一点虽然你的代码不会报错运行也正常但在本实例中这么写就是BUG。
BUG原因索引为i的元素删除后后边元素的索引自动向前补位即原来索引为i1的元素变为了索引为i的元素但是下一次循环取的索引是i1此时你以为取到的是原来索引为i1的元素其实取到是原来索引为i2的元素。
只要每删除一个元素就会漏掉下一个元素所以这种方式从逻辑上来说是存在bug的无论什么需求场景都不建议用这种方式因为不可控因素太多鬼知道生产环境中他会删掉多少元素同时漏掉多少元素。
既然这么写不报错那么个别特殊场景确实可以使用这种普通for循环删除元素的比如我们把实例的需求变动一下改为一个List集合元素类型为String有N个元素删除这些元素中包含字符’a’的元素如果有连续两个或以上元素包含’a’那么只删除当前连续元素中的奇数位元素。虽然这种场景适用但仍然不推荐还是因为太不可控。
错误答案2增强for循环foreach
public static void main(String[] args) {ListString list new ArrayList(4);list.add(a);list.add(ab);list.add(abc);list.add(abcd);for (String str : list) {if (str.contains(a)) {list.remove(str);}}System.out.println(list);
}运行报错
Exception in thread main java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)at java.util.ArrayList$Itr.next(ArrayList.java:859)at top.oldmoon.learn.test.ListTest.main(ListTest.java:24)使用百度翻译可以知道Concurrent Modification Exception并发修改异常
分析
可以简单的理解为foreach就不支持对集合中的元素进行增删操作但是可以修改。