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机制。
热门推荐
抑郁症的躯体化症状是怎么引起的
2030~2040年人机融合对战争形态及军事体系变革的影响
海上丝绸之路的作用探析
团队如何高效约定时间?
从需求收集到需求落地,需求分析如何才能更全面?
如何选择合适的黄金指数进行参考?这类指数的特点有哪些?
comex黄金期货行情如何?该行情对投资者有哪些启示?
选择怎么样的域名
如何规划城市交通以提高效率?这些规划对居民生活有何益处?
如何有效祛湿?
《永恒的记忆》,爱能战胜遗忘
光伏电站清洁方式大比拼:哪种方式最经济?
新学期开始总是没干劲,如何缓解开学焦虑?
如何修复 Windows 10 和 11 中的文件夹恢复为只读模式
慢热型人格的心理特质与社交适应
湖人惜败告急!勇士森林狼逼近,警惕跌出西部前六?
【绘本教学】以视觉推动兴趣与认知的幼儿阅读教学活动
2025公办专科最低多少分能上?全国各省录取分数线汇总
手腕痛,警惕腕管综合征
西湖龙井已开采!想要了解龙井茶,"狮、龙、云、虎、梅"5大字号得先知道
动漫人物怎么画:从基础到进阶的绘画指南
聚乙二醇合成:从实验室到工业应用的完整链条
韭菜用什么肥料长得最好?
治疗失眠的中成药这么多,该怎么选择?
单件流与批量生产:工厂应如何抉择?
央视曝光:中国首款火箭炮巡飞弹“飞龙-60A”,破甲350mm,可蜂群攻击
一岁宝宝可以吃米饭吗,好消化吗
柳叶刀子刊:心理干预能有效预防亚临床抑郁状态升级为抑郁症
显卡核心频率对帧数影响大吗
乳酸菌是益生菌嗎?有哪些功效?專家為你全面解析