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机制。
热门推荐
被人打轻微伤怎么维护自己的权益
合伙企业法律制度:权益、风险与合规之道
专家解析:年轻人失眠的原因及治疗方法
宝宝爱吃手,多大需要干预?
儿童骨龄检测的意义是什么?哪些孩子要测骨龄?
糖尿病人看个牙怎么还要查血糖?原因是——
己卯走正官大运:命理分析与生活指导
数字农田:智慧农业数据的采集与分析平台
如何保障信息安全?必备的数据备份与恢复措施!
翡翠原石包浆是什么?详解其概念与形成过程
为了儿子的小升初考试,孙燕姿差点"退圈"?
外卖盒上的国潮少女,现已制霸中国街头
真正被爱过的人,才能活出松弛感
中山居住证办理方式(线上+线下)
已经开始期待川西的夏天了,这7个地方的自然风光,简直是封神级
92号汽油的车,我不差钱可以长期加95号汽油吗?新手不懂赶紧看看
耳机耳垫:如何选择和更换?
为何梅西被称作球王?天赋与努力缺一不可,梅西技术特点难以复制
甲状腺囊肿分二类三类怎么分
汗蒸对人体有什么好处?
蜂蜜储存与真假鉴别全攻略
如何评估 AI 代码生成的准确性和质量
机械键盘配列选择指南:从108键到42键,总有一款适合你
如何分析尾盘集合竞价的市场表现?这些表现如何影响投资决策?
不只变丑,还会影响呼吸功能!这个问题早发现很关键,两步自测→
SD-WAN专线接入与互联网接入对比:企业网络选择指南
全国各地的博物馆文案,简直神仙打架
浅谈电子胶粘剂在工业中的应用
私人土地买卖合同的范本:深度解析与法律适用
山西古建筑壁画:展现中国古代艺术魅力的瑰宝