问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Iterator、for遍历集合的优缺点

创作时间:
作者:
@小白创作中心

Iterator、for遍历集合的优缺点

引用
CSDN
1.
https://blog.csdn.net/maozhr720/article/details/76222732

在Java中,对于在内存中存储空间为连续的集合,如ArrayList、数组,可以采用以下三种方式进行遍历:

1. Iterator遍历

迭代器遍历方式,适用于连续内存存储方式,比如数组、ArrayList(其实ArrayList底层实现也是数组形式)。缺点是只能从头开始遍历,优点是可以边遍历边删除。

例如:

Iterator iter = list.iterator();
while(iter.hasNext()){
    Object o = iter.next();
    if(o.equals("a")){
        iter.remove();
    }
}

2. for each遍历

底层实现也是基于iterator,所以也只能从头开始遍历,性能上比iterator要稍慢一些,因为多了一层类型自动转换。

3. 基于list.size的for循环遍历

这种方式遍历比较灵活,可以指定位置开始遍历。性能最高,但是使用不太优雅,每次都需要在应用程序中手动强转和额外的获得list.size,这样就会导致产生额外的代码。

基于for方式的遍历,还有一个缺点就是遍历过程中不允许删除元素,否则会抛ConcurrentModificationException。如下:

ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
//list.remove(1);
Iterator iter = list.iterator();
for(String s:list){
    if(s.equals("b")){
        list.remove(s);
    }
}

为什么用iterator删除元素不抛异常,而用for删除会抛异常呢?这主要是因为ArrayList每次遍历的时候会去判断该集合是否被修改过,调用的方法是checkForComodification()。如果被修改过ConcurrentModificationException异常。

如何判断是否修改呢,主要是通过维护2个变量来实现,modCount记录了修改次数,expectedModCount记录期望修改次数。通过iterator.remove()进行的删除操作,会同时修改modCount、ConcurrentModificationException;而通过list.remove(object/index),则只会修改modCount。这也是fast-fail机制。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号