关于Java集合中元素的删除问题详解_Tommy·Vercetti 的博客-CSDN博客
在集合遍历(迭代)过程中,不允许元素通过集合删除,可以通过迭代器进行删除因为在集合进行迭代过程中,不允许集合的结构发生改变
import java.io.BufferedReader; import java.util.*; @SuppressWarnings({"all"}) public class interate{ public static void main(String[] args) { Collection c = new ArrayList(); Iterator it = c.iterator(); //此时的迭代器是指向空的集合的迭代器 /* 因为设置了迭代器后,集合的结构发生了改变 注解:只要集合的结构繁盛了改变,迭代器必须重新获取。 不允许这种情况,所以程序在运行后报异常: java.util.ConcurrentModificationException */ c.add(1); c.add(2); c.add(3); c.add(4); //此时集合的状态发生了改变,而迭代器没有得到更新,所以抛出异常 while(it.hasNext()){ Object obj = it.next(); System.out.println(obj); } } } 1234567891011121314151617181920212223
错误样式二:
import java.io.BufferedReader; import java.util.*; @SuppressWarnings({"all"}) public class interate{ public static void main(String[] args) { Collection c = new ArrayList(); c.add(1); c.add(2); c.add(3); c.add(4); Iterator it = c.iterator(); while(it.hasNext()){ Object obj = it.next(); c.remove(); //抛出异常。 System.out.println(obj); } } } 12345678910111213141516171819
正确方式:
import java.io.BufferedReader; import java.util.*; @SuppressWarnings({"all"}) public class interate{ public static void main(String[] args) { Collection c = new ArrayList(); c.add(1); c.add(2); c.add(3); c.add(4); Iterator it = c.iterator(); while(it.hasNext()){ Object obj = it.next(); it.remove(); //正确 System.out.println(obj); } } } 12345678910111213141516171819
利用迭代器进行删除操作,这样进行的删除操作会同步到集合和迭代器,所以可以实现正确的删除元素,但是如果按照删除集合中的元素,那么会抛出异常,无法实现和迭代器的集合元素相匹配。
执行Iterator it = c.iterator()
时,相当于对集合拍了一个快照,迭代器进行迭代时会参照这个快照进行迭代。
直接在集合中删除元素并没有通知迭代器,导致二者在遍历时不同步,报异常。
而通过迭代器去删除时,再删除集合中元素的同时,也把迭代器中的元素删除了,这样就实现了迭代器和原来集合的同步,不会报异常。
所以集合结构发生改变时,必须重新获取迭代器。
在迭代元素的过程中,一定要使用Iterator的remove方法删除元素,不要使用集合的删除方法。