全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java中ArrayList的removeAll方法详解

本文介绍的是关于Java中ArrayList的removeAll方法的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:

在开发过程中,遇到一个情况,就是从所有骑手Id中过滤没有标签的骑手Id(直接查询没有标签的骑手不容易实现),

List<Integer> allRiderIdList = new ArrayList(); // 所有的骑手,大致有23W数据
List<Integer> hasAnyTagRiderId = new ArrayList(); // 有标签的骑手, 大致有21W数据
List<Integer> withoutAnyTagRiderList = allRiderIdList.removeAll(hasAnyTagRiderId);

逻辑很简单,就是取一个差集,这样子就拿到没有任何标签的骑手数据。

但是在实际开发过程中,removeAll这个动作很耗时,做测试大概要4分钟左右。查看ArrayList中removeAll的源码片段:

public boolean removeAll(Collection<?> c) {
 Objects.requireNonNull(c);
 return batchRemove(c, false);
}

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++) // 循环原来的list
  if (c.contains(elementData[r]) complement) // 这里调用contains方法
  elementData[w++] = elementData[r];
 } finally {
 ....
 }
 return modified;
}

在循环过程中调用contains方法做比较,查一下ArrayList的contains方法,源代码片段如下:

public boolean contains(Object o) {
 return indexOf(o) >= 0;
}

public int indexOf(Object o) {
 if (o null) {
 for (int i = 0; i < size; i++)
  if (elementData[i]==null)
  return i;
 } else {
 for (int i = 0; i < size; i++)
  if (o.equals(elementData[i]))
  return i;
 }
 return -1;
}

这可以看出来,在比较的过程中,又调用了一次循环。

所以removeAll两层for循环,复杂度O(m*n),所以在操作比较大的ArrayList时,这种方法是绝对不可取的。

下面看一下最终的实现方式:

private List<Integer> removeAll(List<Integer> src, List<Integer> target) {
 LinkedList<Integer> result = new LinkedList<>(src); //大集合用linkedlist
 HashSet<Integer> targetHash = new HashSet<>(target); //小集合用hashset
 Iterator<Integer> iter = result.iterator(); //采用Iterator迭代器进行数据的操作

 while(iter.hasNext()){ 
 if(targetHash.contains(iter.next())){
  iter.remove();
 }
 }
 return result;
}

同样数量级list, 整个过程只需要几十毫秒,简直天壤之别。

回过头来,比较一下两种实现方式,为什么差距这个大。

1、外层循环

     一个是普通的for循环,一个迭代器遍历元素,二者相差不大

2、内层数据比较

     前者通过index方法把整个数组顺序遍历了一遍;

     后者调用HashSet的contains方法,实际上是调用HashMap的containKey方法,查找时是通过hash表查找,复杂度为O(1)。

接下来我们简单看一下hash表。

hash表是一种特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找。这个源于Hash表设计的特殊性,它采用了函数映射的思想将记录的存储位置与记录的关键字关联起来,从而能够很快速地进行查找。可以简单理解为,以空间换时间,牺牲空间复杂度来换取时间复杂度。

hash表采用一个映射函数 f : key —> address 将关键字映射到该记录在表中的存储位置,从而在想要查找该记录时,可以直接根据关键字和映射关系计算出该记录在表中的存储位置,通常情况下,这种映射关系称作为hash函数,而通过hash函数和关键字计算出来的存储位置(注意这里的存储位置只是表中的存储位置,并不是实际的物理地址)称作为hash地址。

上面的图大家应该都很熟悉,hash表的一种实现方式,是由数组+链表组成的。元素放入hash表的位置通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。

另外hash表大小的确定也很关键,如果hash表的空间远远大于最后实际存储的记录个数,则造成了很大的空间浪费,如果选取小了的话,则容易造成冲突。在实际情况中,一般需要根据最终记录存储个数和关键字的分布特点来确定Hash表的大小。还有一种情况时可能事先不知道最终需要存储的记录个数,则需要动态维护Hash表的容量,此时可能需要重新计算Hash地址。
当然,关于hash表要说的话太多,先简单到此吧~~~

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# arraylist  # removeall  # arraylist的removeall  # java  # removeall方法  # JAVA ArrayList详细介绍(示例)  # JAVA LinkedList和ArrayList的使用及性能分析  # Java中ArrayList类的使用方法  # java的arraylist排序示例(arraylist用法)  # Java ArrayList 数组之间相互转换  # java数据结构实现顺序表示例  # Java实现一个顺序表的完整代码  # Java实现顺序表的增删查改功能  # Java中ArrayList与顺序表的概念与使用实例  # 过程中  # 遍历  # 小集  # 看一下  # 的是  # 链表  # 迭代  # 是一种  # 太多  # 相关内容  # 是由  # 在实际  # 没有任何  # 两种  # 而在  # 是从  # 一遍  # 数据结构  # 也很  # 不容易 


相关文章: 一键网站制作软件,义乌购一件代发流程?  专业网站建设制作报价,网页设计制作要考什么证?  如何快速生成ASP一键建站模板并优化安全性?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  建站之星导航配置指南:自助建站与SEO优化全解析  宿州网站制作公司兴策,安徽省低保查询网站?  实惠建站价格推荐:2025年高性价比自助建站套餐解析  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  XML的“混合内容”是什么 怎么用DTD或XSD定义  网站制作员失业,怎样查看自己网站的注册者?  如何通过虚拟主机快速搭建个人网站?  如何高效配置香港服务器实现快速建站?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  python的本地网站制作,如何创建本地站点?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  如何选择适配移动端的WAP自助建站平台?  如何通过西部建站助手安装IIS服务器?  网站企业制作流程,用什么语言做企业网站比较好?  如何通过云梦建站系统实现SEO快速优化?  建站之星如何实现网站加密操作?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  已有域名和空间如何搭建网站?  C#怎么创建控制台应用 C# Console App项目创建方法  青岛网站建设如何选择本地服务器?  深圳网站制作案例,网页的相关名词有哪些?  在线教育网站制作平台,山西立德教育官网?  javascript中对象的定义、使用以及对象和原型链操作小结  建站之星备案是否影响网站上线时间?  常州企业建站如何选择最佳模板?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  C#如何序列化对象为XML XmlSerializer用法  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  Python文件管理规范_工程实践说明【指导】  php json中文编码为null的解决办法  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何选择适合PHP云建站的开源框架?  如何在万网ECS上快速搭建专属网站?  如何用5美元大硬盘VPS安全高效搭建个人网站?  建站之星与建站宝盒如何选择最佳方案?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  网站图片在线制作软件,怎么在图片上做链接?  详解jQuery中基本的动画方法  建站主机是什么?如何选择适合的建站主机?  活动邀请函制作网站有哪些,活动邀请函文案?  深圳网站制作的公司有哪些,dido官方网站?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  建站为何优先选择香港服务器?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。