Java删除集合中元素的正确姿势

1、使用foreach的话,在删除完元素之后,接着遍历就会抛异常。如下图所示:
Java删除集合中元素的正确姿势_第1张图片
Java删除集合中元素的正确姿势_第2张图片

因为foreach实际的实现原理是迭代器的方式去遍历,会去调用Itr对象的hasNext()和next()方法。在该类的next和remove方法中,都会去调用checkForComodification()方法,该方法内部就做了一件事,判断modCount(实际修改的次数)和expectedModcount(期望修改的次数)是否一致。
Java删除集合中元素的正确姿势_第3张图片
因此可以看出,在foreach中去执行list.remove(Object o)方法时,调用到了fastRemove(int index)对list对象的modCount是进行了修改的,但是list对象的迭代器中的exceptedModCount并没有改动,所以此时会抛出ConcurrentModificationException异常
Java删除集合中元素的正确姿势_第4张图片
2、使用普通的for循环,不会抛异常,但是接着遍历所得到的数据可能是不正确的,因为在删除元素后,没有修改对应的下标。
Java删除集合中元素的正确姿势_第5张图片
Java删除集合中元素的正确姿势_第6张图片
因为在list中的remove方法逻辑是将目标元素之后的元素整体向前移动一个位置,然后将最后一个位置置为null,size-1. 
Java删除集合中元素的正确姿势_第7张图片

3、迭代器的方式:List内部实现了Iterator接口,通过它可以得到一个list的iterator对象。使用该方式可以顺利地删除和遍历集合中的元素,推荐使用。注意这里使用的是迭代器Iterator的remove()方法。在该方法的remove中,每次都会保持modCount和exceptedModCount的一致性。
Java删除集合中元素的正确姿势_第8张图片

Java删除集合中元素的正确姿势_第9张图片 Java删除集合中元素的正确姿势_第10张图片
Java删除集合中元素的正确姿势_第11张图片




你可能感兴趣的:(Java)