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机制。
热门推荐
100个哲学术语,让你轻松变为哲学达人!
海南亲子游目的地与全年龄段家庭活动指南
影响人类历史进程的100名人
燕京大学在哪里?揭秘历史真相与遗址寻踪
适合小学生观看的红色主题电影推荐
美国一年制商科硕士专业详解:热门专业就业前景及推荐院校大盘点
复杂情感与血战再临——《蛮战第2季》
循环水系统节能节水优化技术
打代码用什么笔记本比较好,还有配置用哪个
Excel公式故障排除指南:常见问题及解决方案
大理游玩指南:风花雪月间的文化与自然之旅
从四会到大理的路程、交通方式及旅行建议全解析
古代饥荒研究:灾民为什么不去抓河里的鱼虾?
期货交易中临界点的确定方法
長者健康鞋介紹:香港老人防滑鞋款式、特點一覽
TOB销售与TOC销售的区别
70岁以上高端医疗保险有哪些
回转窑规格尺寸和产量的确定依据是什么
公积金比例怎么调整?HR必须掌握的6大关键点
蜡笔小新配音技巧:声音特征、语调技巧与角色个性的完美融合
手机开启了热点但电脑无法连接?别着急,看这里!
构成轻伤如何判刑?一文详解轻伤鉴定标准与量刑依据
附子理中丸:温中祛寒的中药制剂及其三个搭配方案
海外票房破1.5亿元,《哪吒2》在海外反响如何?
农发行60期还款协商流程及条件
网贷逾期后的坦白指南:从时机选择到后续行动
常设仲裁法院:国际仲裁的重要机构
单行道违法拍照规则:如何正确进行拍照及遵守法律法规?
严把过程关,增强研究生教育质量
联合培养模式下硕士研究生优质教学资源共享研究