【转载】ArrayList 中数据删除 & fail fast
在循环arrayLlist时,经常会遇到remove操作,那么arrayList的remove的底层是怎么做的?
AbstractList中,有一个属性modCount,这个属性是跟踪list中数据被修改的次数,任何对list的add/remove操作,都将导致modCount++.
在AbstractList中还有一个内部类Itr implements Iterator,Itr是一个list遍历的工具类,当然list.iterator()方法也是返回Itr对象,在Itr中有一个校验位属性expectedModCount;对于一个itr对象,其初始时expectedModCount=modCount.
Iterator是list一个视图,其最终还是操作list的存储结构.在使用iterator遍历时,remove()操作,会导致modCount++(AbstractList.remove()),但是还有expectedModCount=modCount,即在iterator中remove数据,会带来expectedModCount与modCount值的同步.
在Iterator遍历时,next(),remove()方法会校验expectedModCount与modCount值是否一致,如果不一致,就意味着这list数据在iterator外部被修改,此时iterator遍历将会造成ConcurrentModificationException.
AbstractLlist不仅支持普通的iterator,还支持ListIterator(ArrayList,LinkedList均支持),ListIterator增加了遍历时双向游标能力(previous,next),增加了add方法.add方法和remove方法一样也做了expectedModCount和modCount一致性校验.
引申一下,如下四个对list数据删除的代码,有区别吗??
如下是4中循环方式:
1) for(int i=0;i list.size();i++){ list.remove(i); 2) for(int i=list.size()-1;i i--){ list.remove(i); int size = list.size(); for(int i=size-1;i i--){ list.remove(i); 4) for(Object i : list){ list.remove(i);//如果list中存在多个Object互相equals时,此方法仍然有效.注意list.remove(Object)内部使用了遍历操作,并使用equals来比较对象并删除. 5) Iterator it = list.iterator() while(it.hasNext()){ it.next(); it.remove();
1),2),3)是最普通的遍历方式,但是在遍历并有删除操作时,似乎它们执行的结果还有些差距,根据坐标删除,那么1)实事上只会有一半被删掉,1)中每删除一次,计算一次list.size(),但是当前i++,且前端删除会造成数组结构copy.
2)后端删除,不会造成copy,每次都是删除最后一个位置,直至结束
3)因为size没有重新计算,在删除一半数据后,抛出IndexOutOfBoundsException
4)/5)正常
提示:foreach方式最终是转换成了iterator的方式进行.(产生于编译过程中).
原文链接:[http://wely.iteye.com/blog/2228829]
fail-fast 机制 大家好,我是指北君。 PS:最近又赶上跳槽的高峰期,我连日加班好多天,终于整理好了,16000+ 道,295多份,多份面试题大全,我会持续更新中,马上就会整理更多!【文末有领取方式】
LeetCode 19:删除链表的倒数第N个节点 Remove Nth Node From End of List 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 Given a linked list, remove the n-th node from the end of list and return its head. 给定一个链表: 1- 2- 3- 4- 5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1- 2- 3- 5. 给定的 n 保证是有效的。
什么是快速失败(fail-fast)和安全失败(fail-safe)?它们又和什么内容有关系。以上两点就是这篇文章的内容,废话不多话,正文请慢用。
相关文章
- [java] javax.el.PropertyNotFoundException: Property 'id' not found on type bean.Student
- 胖子哥的大数据之路(11)-我看Intel&&Cloudera的合作
- [Typescript] Type Queries (keyof & typeof)
- 【IOS-COCOS2D-X 游戏开发之十】自定义CCSPRITE/LAYER/CCNODE及静态类模版&自定义类细节说明&COCOS2DX触屏事件讲解
- Apache Spark源码走读(十一)浅谈mllib中线性回归的算法实现&Spark MLLib中拟牛顿法L-BFGS的源码实现
- DataScience&ML:基于heart disease心脏病分类预测数据集利用决策数算法基于graphviz/eli5/pdpbox/shap库实现模型可解释性(全局/部分/局部解释)之详细攻略
- ML之LassoR&RidgeR:基于datasets糖尿病数据集利用LassoR和RidgeR算法(alpha调参)进行(9→1)回归预测
- ML之RF&XGBoost:分别基于RF随机森林、XGBoost算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还)
- DL之RNN:基于TF利用RNN实现简单的序列数据类型(DIY序列数据集)的二分类(线性序列&随机序列)
- DL之LiR&DNN&CNN:利用LiR、DNN、CNN算法对MNIST手写数字图片(csv)识别数据集实现(10)分类预测
- 【人工智能&AI大数据】AI 的未来:ChatGPT 世界中值得关注的 4 大趋势
- 【大数据&人工智能】统计学入门——数据科学领域最需要了解的统计学基础概念
- 三次握手 && 四次挥手
- poj1573&&hdu1035 Robot Motion(模拟)
- Demo of Python "Map Reduce Filter"
- 资深测开大佬亲传《测试武功论》带你了解软件测试中的内功&外功!
- 请说明SQLServer中delete from tablea & truncate table tablea的区别
- Chapter2 ROS通信机制----基础篇(Ⅲ)&ROS常用命令及实操训练
- 【线代&NumPy】 特征值分解
- 【大数据实时数据同步】OGG异构多路映射同步原表&审计表&只存删除数据表实现方案(一)