最近在处理list循环操作的时候遇到了Java ConcurrentModificationException异常,下面介绍一下这个异常产生的原因,以及如何处理该异常。
原因
对Vector、ArrayList在迭代的时候如果同时对其进行修改
解决办法
以下四种方式可以实现遍历list删除某些特征元素
方式:
方法1、普通for循环 遍历List,删List除自身 特征条目;
缺点:不会抛异常 但结果 未必正确 由于list.size()在变动 根据脚标删除的未必是 特征元素;
方法2、高级for循环 遍历List,删除List自身 特定条目;
缺点:会抛异常 :java.util.ConcurrentModificationException;
方法3、引入参考List,for循环遍历删除原List 特定条目;
可实现,不抛出异常。
方法4、利用iterator 遍历删除List特定条目
可实现,不抛出异常。
下面给出这四种方法的实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| for (int i = 0; i < list.size(); i++) { if (list.get(i).getName().equals("A")) { list.remove(list.get(i)); } }
for (Bean item : list) { if (item.getName().equals("A")) { list.remove(item); } }
List<bean> referenceList = new ArrayList<bean>(); referenceList.addAll(list);
for (int i = 0; i < referenceList.size(); i++) { if (referenceList.get(i).getName().equals("A")) { list.remove(referenceList.get(i)); } }
Iterator<bean> it = list.iterator(); while (it.hasNext()) { Bean student = it.next(); if (student.getName().equals("A")) it.remove(); }
|