privatestatic List<String> list = new ArrayList<>();
static { //初始化集合 for (int i = 1; i <= 10; i++) { list.add(String.valueOf(i)); } }
publicstaticvoidmain(String[] args){ //使用for-each迭代时删除元素 for (String str : list) { if ("1".equals(str)) { list.remove(str); } } }
或者你使用迭代器Iterator遍历时,删除元素。
1 2 3 4 5 6 7 8 9 10
publicstaticvoidmain(String[] args){ //使用Iterator迭代器遍历时,删除元素 Iterator<String> it = list.iterator(); while (it.hasNext()) { String str = it.next(); if ("1".equals(str)) { list.remove(str); } } }
以上两种情况都会报这个错:
1 2 3
Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) at java.util.ArrayList$Itr.next(ArrayList.java:851)
这就是不正确的删除姿势,那怎么删呢?
使用for-i循环遍历删除(亲测有效):
1 2 3 4 5 6 7 8 9 10
publicstaticvoidmain(String[] args){ //使用Iterator迭代器遍历时,删除元素 for (int i = 0; i < list.size(); i++) { String s = list.get(i); if ("1".equals(s)) { list.remove(s); } } list.forEach(System.out::println);//2 3 4 5 6 7 8 9 10 }
使用for-i循环倒序遍历,删除元素。
1 2 3 4 5 6 7 8 9 10
publicstaticvoidmain(String[] args){ //使用for-i倒序遍历,删除元素 for (int i = list.size() - 1; i >= 0; i--) { String str = list.get(i); if ("1".equals(str)) { list.remove(str); } } list.forEach(System.out::println);//2 3 4 5 6 7 8 9 10 }
使用Iterator的remove()方法删除。
1 2 3 4 5 6 7 8 9 10 11
publicstaticvoidmain(String[] args){ //使用Iterator迭代器遍历时,删除元素 Iterator<String> it = list.iterator(); while (it.hasNext()) { String str = it.next(); if ("1".equals(str)) { it.remove(); } } list.forEach(System.out::println);//2 3 4 5 6 7 8 9 10 }