`
QING____
  • 浏览: 2232646 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ArrayList中数据删除

    博客分类:
  • JAVA
 
阅读更多

在循环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>=0;i--){

list.remove(i);

}

3)

int size = list.size();

for(int i=size-1;i>-1;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的方式进行.(产生于编译过程中).

分享到:
评论

相关推荐

    java数据结构 ArrayList、Stack、Map

    java数据结构 ArrayList、Stack、Map,为提高效率,未做边界判断(由开发人员保证逻辑上不会出现越界),实现了添加和查询的功能,无修改删除功能

    Arraylist与LinkedList区别

    可以从它们的底层数据结构、效率、开销进行阐述...4,插入、删除数据时,LinkedList的效率比较高,因为ArrayList要移动数据。 5,LinkedList比ArrayList开销更大,因为LinkedList的节点除了存储数据,还需要存储引用。

    java关键字ArrayList详解

    ArrayList是Java中的一种常见的数据结构,它实现了List接口,是线程不安全的动态数组。它的容量可以自动增长,因此可以方便地插入、删除和查找数据,是Java集合框架中广泛使用的一种结构。 ArrayList的优势在于灵活...

    Java中ArrayList和LinkedList区别

    对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。  ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)。例如我们可以用ArrayList来存储一系列的String...

    java面向对象课程设计——学生管理系统——附源码+word文档

    实现一个简单的学生管理系统,能支持学生数据(Student)的显示、增加、修改和删除等操作,学生信息包括学号、姓名、性别、专业。具体要求如下: (1)学生数据按对象序列化写入student.dat文件 (2)程序启动后,从student...

    Java基础–为什么ArrayList,Vector等都不支持循环中remove?

    为什么ArrayList,Vector等都不支持循环中remove1 Vector 直接删除2 Vector 遍历元素2.1 for循环遍历2.2 迭代器循环2.3 任意方向遍历2.4 Vector的foreach3. Vector迭代器删除4. Vector不使用迭代器删除元素5. Vector...

    hbase-0.90.2中创建表、插入数据,更新数据,删除数据

    假设有一个不知道是干什么表:) 表里需要存入人员和其相对应的部门信息 HBaseAdmin admin = new HBaseAdmin(configuration); List&lt;Put&gt; putuser = new ArrayList();

    Java ArrayList

    ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。 ArrayList 继承了 AbstractList ,并实现了 List 接口。 ArrayList 类位于 java.util 包中,使用...

    数据结构-链表 JAVA语言实现

    数据结构-链表 JAVA语言实现,包含单向链表、双向链表、循环链表的遍历、删除和插入 详细介绍:http://blog.csdn.net/z740852294/article/details/77369439

    C#中数组Array,ArrayList,泛型List详细对比

    关于数组Array,ArrayList,泛型List,简单的说数组就是值对象,它存储数据元素类型的值的一系列位置.Arraylist和list可以提供添加,删除,等操作的数据. 具体如何进行选择使用呢,我们来详细探讨下

    图解 Java 中的数据结构及原理.docx

    最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程。 主要基于jdk8, 可能会有些特性与jdk7之前不相同, ... 指定序列操作则性能不如ArrayList, 这也是其数据结构决定的.

    WinForm下的数据绑定分页控件

    1. 数据源为ArrayList类型的自动分页的可排序数据绑定控件; 2. 数据源为ArrayList类型的手动分页的可排序数据绑定控件; 3. 数据源为DataTable类型的自动分页的可排序数据绑定控件; 4. 数据源为DataTable类型的...

    仿淘宝源码

    3:Arraylist中数据的多项删除,使用倒序删除法,该功能在购物车删除功能体现 4:在购物车中出现的CheckBox选择后串行问题,使用ScrollView嵌套ListView方法解决,该功能在购物车中体现 5、扫码、获取默认的NFC控制器...

    Arraylist的一些值得思考的问题

    1、初始化做了哪些事儿 2、第一次开辟的空间有多少?那初始化时指定开辟空间长度是否更有利于内存资源节省 3、扩容是在什么时候扩...6、for循环数据过程中删除数据是否异常?如果异常,寻找为何异常?如何规避这个异常

    java数据结构课程设计——简易GPS导航(最优路径)源码+文档

    主要实现查找任意两地点间最短路径并获得其长度,添加地点,删除地点,添加路线,删除路线操作 该系统带有模拟地图的加权无向图,直观的表现各地点间的关系及所做操作的响应结果 可通过鼠标操作或文本输入的形式...

    Exercicios-ArrayList-POO:ArrayList和OOP修复练习已解决

    [删除数据]编写一个包含5个预定义名称列表的程序 挂号的。 该程序应为用户提供从列表中排除单个名称的选项,并带有 介于1到5之间的值。 [实体列表]编写一个程序,该程序在整数值的数字列表中注册 10至100之间的10...

    ArrayList类&关于列表有用的一些方法.pptx

    ArrayList类&关于列表有用的一些方法学习目标清楚ArrayList类的作用熟记ArrayList类中的常用方法会使用ArrayList类实例化对象并对批量数据进行管理;掌握对ArrayList类实例的遍历、插入、修改、删除等操作;(重点、...

    ArrayList删除集合中某一属性相同的元素方法(推荐)

    下面小编就为大家带来一篇ArrayList删除集合中某一属性相同的元素方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    07:ArrayList集合的增删减除.pdf

    1.长 增加add,查看下表,遍历,删除值,下标,数组,改下标付值, 度是可变的 length:长度 capacity:容量,capacity不能小于实际内容的值,当你将length...不管什么类型的数据,存储之后,取出来使用必须通过类型转换

    数据结构与算法分析_Java语言描述(第2版)

    中文名: 数据结构与算法分析_Java语言描述(第2版) 作者: 韦斯 译者: 冯舜玺 ...12.2.3 自顶向下的删除 12.3 确定性跳跃表 12.4 AA树 12.5 treap树 12.6 kd树 12.7 配对堆 小结 练习 参考文献 索引

Global site tag (gtag.js) - Google Analytics