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的一致性。
因为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的一致性。
相关文章推荐
- java中如何正确的删除集合中的元素
- 编程技巧系列(2)Java 集合(List,Set,Map)遍历时有条件删除特定元素
- java——定义一个功能将ArrayList 集合中的重复元素删除(java集合七)
- JAVA中,List<Interger>集合怎么删除特定值的元素,不是根据下标
- 【Array、List】Java数组或集合中如何删除元素
- JAVA 小技巧之集合元素的批量删除
- java中循环遍历删除List和Set集合中元素的方法
- Java中如何循环删除一个集合(如List)中的多个元素
- 实现Java删除一个集合的多个元素
- Java 遍历Map(包括集合)时,修改删除元素
- Java使用迭代器遍历集合,遍历过程中可删除元素
- java-集合类(3)-实现比较器(Comparator)接口-LinkedList针对插入删除、开始处增加元素
- Java中删除Map,Set集合中的部分元素
- java 删除ArrayList LinkedList集合中的重复元素
- for循环删除集合中的元素不正确
- Java中如何循环删除一个集合(如List)中的多个元素
- Java集合删除元素可能出现的问题
- java 集合之ArrayList集合元素重复删除
- java中集合删除元素的两种常用方式及新手易错
- Java集合删除元素ArrayList实例详解