我们知道 ArrayList 中有一个批量删除的集合的方法:removeAll(Collection> c),该方法中涉及了高效保存两个集合公有元素的算法,这里特地拿出来分析一下,学习源码中的优秀设计思想。

下面先给出批量删除代码的片段:

/**这里先假设elementData(ArryList内部维护的一个Object[]数组)和

集合c的交集是A:

当 complement == true 时,elementData最终只会存储A

当 complement == false 时,elementData最终删除A。

在对elementData的元素进行筛选的时候,这里使用了r、w两个游标,

从而避免从新开辟一个新的数组进行存储。

**/

private boolean batchRemove(Collection> c, boolean complement) {

final Object[] elementData = this.elementData;

int r = 0, w = 0;

boolean modified = false;

try {

for (; r < size; r++)

//当调用removeAll(Collection> c)时,complement == false,

//此时elementData数组中存储的是去掉A的部分

if (c.contains(elementData[r]) == complement)

elementData[w++] = elementData[r];

} finally {

// Preserve behavioral compatibility with AbstractCollection,

// even if c.contains() throws.

//出现异常会导致 r !=size , 则将出现异常处后面的数据全部

//复制覆盖到数组里。

if (r != size) {

System.arraycopy(elementData, r,

elementData, w,

size - r);

w += size - r;

}

if (w != size) {

// clear to let GC do its work

for (int i = w; i < size; i++)

elementData[i] = null;

modCount += size - w;

size = w;

modified = true;

}

}

return modified;

}

我们先分析正常情况,即 r == size:

注意到只有 elementData和都为空或者c的元素都不在elementData中的情况下,才会出现 w == size,因为都为空或者没有相同元素,所以不存在删除的情况。

所以只用分析 w != size的情况

当 w != size 时,一旦出现elementData中有,但是c中没有的元素的时候,就会存放在elementData[w]中,也就是说0~(w-1)位置一定是

elementData包含但是c中没有的元素,然后将w~(size-1)位置的元素置空,交给GC去回收,这样一来,elementData中就只剩下除去和c中相同元素的数组了,它的size为w。

接下来再说说异常情况:即 r != size:

因为这个时候已经出现了异常,所以把从r位置开始的(size-r)个元素复制到从w开始的到(w+size-r-1)位置,此时 w = size - r,这样就可以保证在出现异常之前已经遍历的c和elementData中的相同元素已经被覆盖了,同时也保证了从r位置开始的(size-r)个元素向左移动了(r-w)位,保证数组元素的完整性。然后在将w~(size-1)位置的元素置空,交给GC去回收。这样即使发生了异常,也不会导致删除错误。

至此,ArrayList的批量删除算法就分析完了,可能看起来有点绕,但是静下心来,用笔在纸上画一画这个过程,你就会豁然开朗。

java arraylis 删除_Java ArrayList批量删除算法分析相关推荐

  1. element table批量删除_element ui 批量删除

    //这里做一个事件 checkbox发生改变时触发 修改 删除 data{ return { multipleSelection: [] //返回的是选中的列的数组集合 这里接收用户选中的id 默认放 ...

  2. 电脑微博批量删除-2023怎么批量删除微博网页版代码

    微博怎么快速批量删除_微博怎么把删除所有微博 你可以用它来批量删除微博.微博批量删除收藏和微博批量删除点赞内容,避免别人挖坟. 「2023批量删除微博工具」批量删除微博代码_手机暂时不能批量删除微博 ...

  3. PHP批量删除报错,批量删除的PHP

    第一个页面shanchu.php 无标题文档 批量删除 代号 名称 $db = new MySQLi("localhost","root","root ...

  4. java arraylist 删除_Java ArrayList删除特定元素的方法

    来源 http://developer.51cto.com/art/201503/469612.htm ArrayList是最常用的一种java集合,在开发中我们常常需要从ArrayList中删除特定 ...

  5. 【RecyclerView】 十一、RecyclerView 数据更新 ( 删除单条数据 | 批量删除数据 )

    文章目录 一.删除单条数据 二.批量删除数据 三.完整代码示例 四.RecyclerView 相关资料 一.删除单条数据 删除单条数据 : 调用 RecyclerView.Adapter 的 void ...

  6. python批量删除注释_批量删除C和C++注释

    使用Python语言 ,实现批量删除C/C++类型注释 1.目前支持去掉.h .hpp .c .cpp .java 这些以//或/**/为注释符的源文件 2.支持递归遍历目录 3.当前版本为Pytho ...

  7. php 批量删除cookie,php批量删除cookie的简单实现方法

    php批量删除cookie的简单实现方法 本文实例讲述了php批量删除cookie的简单实现方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: //删除单个cookie:键值设置为空 ...

  8. 批量删除html网页,批量删除.html · panghuamama/Clearly Local - Gitee.com

     批量删除 $axure.utils.getTransparentGifPath = function() { return 'resources/images/transparent.gif'; ...

  9. php 大批量的删除图片,PHP批量删除记录同时删除图片文件

    非常感谢老师的回答:全选,反选.已完成.可是PHP批量删除记录同时删除文件.代码不知怎么弄.请您给我代码好吗? if (!function_exists("GetSQLValueString ...

  10. python批量删除文件名_python批量删除文件名中的未知字符

    python 批量删除文件名中的未知字符 如上图所示, 需要修改的文件名的个数超过 500 个, 如果一个一个的删除非常的费时间, 现 在用 python 修改很容易,方便又省时间,具体步骤如下 1 ...

最新文章

  1. python开启GPU加速
  2. 密码强弱度检测万能插件
  3. win11 wsl centos7换源aliyun阿里云命令记录
  4. PHP的void mixed
  5. 超级计算机运行吃鸡,决赛圈的时候,如果两个人同时被手雷炸死该怎么办呢?...
  6. Jsp 【项目路径】
  7. 超难的75道逻辑思维题
  8. PHP curl请求https
  9. 极致物业管理软件的系统特点
  10. 缓存着色技术(Cache Coloring)
  11. 邮箱大佬告诉你电子邮箱格式如何正确书写
  12. jul177链接_「jul177小早川中文」无删减版高清天天影音第89集
  13. Difference between Vienna DL LLS and UL LLS
  14. DOTween的使用(一) DOTween实现代码延时执行 + DOTween.Sequence的(队列)的简单介绍
  15. a8处理器相当于骁龙几_ 联发科发布新款中端处理器,能否与高通骁龙765G一战?...
  16. java 垃圾回收之垃圾回收器篇
  17. Android混淆技术综述
  18. 如何测试WizFi210的”串口转无线”功能?
  19. 巴贝奇——筹划信息时代
  20. Page Life Expectancy判断服务器运行SQLSERVER时内存是否充足

热门文章

  1. python找房源_python抓取链家房源信息(三)
  2. 泛函极值问题与变分法
  3. linux用户密码原则,linux系统普通用户设置密码
  4. MySQL基础 创建学生表实现查询基础功能
  5. 《数学之美》阅读笔记
  6. 最短曼哈顿距离(递推+枚举 C++)
  7. iPhone手机使用:苹果新款手机(iPhone X、iPhone XS Max、iPhone XR等)关机、截屏等快捷键
  8. HTML函数多个条件并列,countifs多个并列条件(countifs同一列2个条件
  9. iOS 视频方向修正
  10. 前端学习日志之复刻百度新闻女人专栏