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机制。
热门推荐
鱼刺太细医生说取不出来怎么办
全上海拔鱼刺最多的医院:一天20多例,有的还拔不了!
教育行业师德师风警示教育的案例分析
网贷催收深圳号码是真的吗?分享识别真伪技巧
美学风尚标,威廉·莫里斯崇尚的自然主义
争议升级!乒乓球双打拖累单打?揭秘技战术差异与运动员的取舍困境
雨水节气:好雨知时节,当春乃发生
揭秘传销与非法传销:六大核心区别及法律严惩
高考历史新航路开辟的知识点
荼蘼—独步春风:春日的挽歌与末路之美
没有一位美食爱好者能逃过遵义小吃的诱惑
“怀古诗”的特点
公共政策案例分析:环保政策实施效果评估
生石花脱皮养护指南:从控水到移盆的全程详解
新研究综合射电望远镜数据揭示了扭曲时空的隐形引力波
2025年江苏专转本高数复习方法,轻松应对考试!
企业组织结构中的分公司与子公司的独立性探讨
缺铁性贫血成人原因
两台老电脑的硬件如何组合,搭配出一台最优电脑
诱导客户直接转账犯罪吗?法律分析与实务探讨
墨子出装和铭文有哪些最佳搭配?如何选择适合的装备和铭文?
掌握利率计算与种类,助你做出更明智的理财选择
TPU和硅胶哪个材质好?一文详解两种材料特性与应用场景
妈咪哪里?宝贝呀,妈咪在哪里?探索儿童走失防范与找寻指南!
打嗝不止时的快速止嗝方法
12700F和12700KF处理器对比:200元差价到底值不值?
能用食疗,何必用药,中医教您“寓医于食”
《伤寒论》、《千金方药》中的药物计量与换算
实验室温度计使用和选择完整指南
黄喉处理与清洁全攻略