您的位置:首页 > 编程语言 > Java开发

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

2018-01-11 22:42 190 查看
1、使用foreach的话,在删除完元素之后,接着遍历就会抛异常。如下图所示:




因为foreach实际的实现原理是迭代器的方式去遍历,会去调用Itr对象的hasNext()和next()方法。在该类的next和remove方法中,都会去调用checkForComodification()方法,该方法内部就做了一件事,判断modCount(实际修改的次数)和expectedModcount(期望修改的次数)是否一致。


因此可以看出,在foreach中去执行list.remove(Object o)方法时,调用到了fastRemove(int index)对list对象的modCount是进行了修改的,但是list对象的迭代器中的exceptedModCount并没有改动,所以此时会抛出ConcurrentModificationException异常

2、使用普通的for循环,不会抛异常,但是接着遍历所得到的数据可能是不正确的,因为在删除元素后,没有修改对应的下标。




因为在list中的remove方法逻辑是将目标元素之后的元素整体向前移动一个位置,然后将最后一个位置置为null,size-1. 


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






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: