工作中经常遇到需要取两个集合之间的交集、差集情况,但是普通的retainAll()和removeAll()无法满足数据量大的情况,由此就自己尝试运用其他的方法解决。注:如果数据量小的情况下,还是使用retainAll()和removeAll()方便

1.假使不存在重复数据,如果存在重复数据,也会被覆盖掉,实际情况中,重复数据也无意义。
2.取交集或者差集时存在主数据和从数据的关系,可提前判断一下那个集合数据量更多,来决定主从数据,或者经过两轮比较,或者经过两轮比较,获取两个结果集。下面例举中,list1为主数据,list2为从数据。

取交集

public static void main(String[] args) {//模拟数据List<Integer> list1 = new ArrayList<>();List<Integer> list2 = new ArrayList<>();for (int i = 1; i <= 1000000; i++) {list1.add(i);list2.add(1000000 - i);}//记录开始时间long startTime = System.currentTimeMillis();//最后结果集List<Integer> resultList = new ArrayList<>();//中间存储Map<String, Integer> map = new HashMap<>();list2.forEach(i2 -> {map.put(i2 + "", i2);});list1.forEach(i1 -> {Integer m = map.get(i1 + "");//如果不为空,则证明list1和list2都拥有该数据if (m != null) {resultList.add(i1);}});System.out.println("耗时:" + (System.currentTimeMillis() - startTime) + "ms");System.out.println(resultList.size());}

运行结果

取差集

 public static void main(String[] args) {//模拟数据List<Integer> list1 = new ArrayList<>();List<Integer> list2 = new ArrayList<>();for (int i = 1; i <= 1000000; i++) {list1.add(i);list2.add(1500000 - i);}//记录开始时间long startTime = System.currentTimeMillis();//最后结果集List<Integer> resultList = new ArrayList<>();//中间存储Map<String, Integer> map = new HashMap<>();list2.forEach(i2 -> {map.put(i2 + "", i2);});list1.forEach(i1 -> {Integer m = map.get(i1 + "");//如果为空,则证明list2中无该数据if (m == null) {resultList.add(i1);}});System.out.println("耗时:" + (System.currentTimeMillis() - startTime) + "ms");System.out.println(resultList.size());}

运行结果

总结

在双向一百万的数据情况下,使用retainAll()和removeAll()取交集和差集,都需要很长的时间,但是使用map来存储数据,后续通过循环来对比数据,速度就会有显著提升,此方法可以使用于任意数据结构,只要把中间map的键设置好就可以了。

Java-两个较大的List快速取交集、差集相关推荐

  1. java两个很大的数相加_两个超大数的相加

    两个超大数的相加,主要是判断进一的情况,另外int型有边界限制,所以转换成字符串型进行处理. /** * @description 两个超大的数字相加 * @param $numA string 第一 ...

  2. java两个list合并 去重_java 快速合并去重List

    两个类型一样的List,合并,并且去除重复的数据 public List getPrivilegesByUserId(Long userId){ List roles=this.getRoleIdsB ...

  3. Java两种方式简单实现:爬取网页并且保存

    注:如果代码中有冗余,错误或者不规范,欢迎指正. Java简单实现:爬取网页并且保存 对于网络,我一直处于好奇的态度.以前一直想着写个爬虫,但是一拖再拖,懒得实现,感觉这是一个很麻烦的事情,出现个小错 ...

  4. java实现网页保存_详解Java两种方式简单实现:爬取网页并且保存

    对于网络,我一直处于好奇的态度.以前一直想着写个爬虫,但是一拖再拖,懒得实现,感觉这是一个很麻烦的事情,出现个小错误,就要调试很多时间,太浪费时间. 后来一想,既然早早给自己下了保证,就先实现它吧,从 ...

  5. java 两个sql文_Java和SQL取两个字符间的值

    Java String str = "abcdefg"; String result = str.substring(str.indexOf(">")+1 ...

  6. 两个不同对象的list要取交集(list转map的应用)

    前提说明 当前有两个实体类,LinePort为航线港口中间表实体,存有到港时间,出港时间,航线id和港口id,Port为港口信息表,现在前端需要将两个查询到的实体信息list,List和List通过p ...

  7. 高级JAVA - 利用函数式接口实现通用的取并集/交集/差集进阶版

    在前文(高级JAVA - 利用函数式接口实现通用的取并集/交集/差集)中我们实现了利用函数式接口获取交集/差集 , 但是只能全部生成 , 假如我们只需要一个交集的话 , 所有代码仍然会执行一次 . 比 ...

  8. 高级JAVA - 利用函数式接口实现通用的取并集/交集/差集

    package com.xing.dto;import com.xing.common.utils.XDataUtil; import lombok.Data;import java.util.Arr ...

  9. Java两大数据类型

    Java两大数据类型 java中有8中基本数据类型和3中引用类型 1.8种基本类型 一).4种整型 byte 1字节 -128--127 short 2 字节 -32,768 -- 32,767 in ...

最新文章

  1. MLIR: Infrastructure架构
  2. php调用restful接口_jzq_sdk_php
  3. 手摸手教你使用vue-cli脚手架-详细步骤图文解析[vue入门]
  4. asp.Net Cookie demo
  5. 【原创】Linux安装Redis
  6. BZOJ4881 线段游戏(二分图+树状数组/动态规划+线段树)
  7. 一场360容器圈的武林大会“360互联网技术训练营第九期—360容器技术解密与实践” (附PPT与视频)...
  8. Install and Run Docker on NON ROOT
  9. Maven学习(四)-----Maven中央存储库
  10. HDU 1269 迷宫城堡 (强连通分量,常规)
  11. 基于源码编译安装openssh
  12. 2012年中国系统架构师大会 即将开幕
  13. 查看/统计 代码行数
  14. pytecplot 的安装与启动(tecplot GUI能用但是pytecplot不能用)
  15. 搜索中的深度匹配模型
  16. MV* 模式梳理与理解(还原真实的 MV* 模式)
  17. 软件中的易用性设计及测试(二)
  18. 域名和网址链接被微信浏览器拦截怎么办 微信屏蔽网址打开如何解决
  19. ACTF2022 rsa leak
  20. 技术助力“互联网+”,百度开放云成就3600行

热门文章

  1. Python编程ROS机器人
  2. 趋高智能之运动控制软件伺服控制多轴
  3. 免费网站模版:一个黑色系的公司网站模版(flash幻灯)
  4. vue里dom节点和window对象
  5. 自动抓取app数据技术方案总结
  6. combox数据过滤 wpf_WPF combox数据绑定的问题
  7. 周四见 | 物流人的一周资讯
  8. linux系统查看网关
  9. linux搭建ldap服务器搭建,Linux下安装配置OpenLDAP服务器
  10. 【PTA】计算全班学生C++课程的总成绩和平均成绩 (10 分)