Java-两个较大的List快速取交集、差集

article/2025/10/25 16:04:08

工作中经常遇到需要取两个集合之间的交集、差集情况,但是普通的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的键设置好就可以了。


http://chatgpt.dhexx.cn/article/QDrh1K5e.shtml

相关文章

java中两个list对象取交集、差集

在一般操作中&#xff0c;对于list集合取交集、差集、并集&#xff0c;比较简单&#xff0c;网上有很多例子&#xff0c;如&#xff1a; 今天我们来说一下对于两个list集合该如何取交集与并集&#xff1a; 如下两个集合&#xff1a;groupEntityList、saveEntities&#xff0c;…

两个 list 求交集

两个 list 求交集, 一种方式是手动遍历, 然后判断是否 contains, 然后添加到结果 list 中 这里介绍另外一个方法 直接调用 list1.retainAll(list2), 调用完成后, list1 中不在 list2 的元素都会被剔除, 此时 list1 就是交集 /*** retain* 保留*/Testpublic void testRetain() …

部署Kubernetes Dashboard 及监控组件 Heapster

部署Dashboard 项目地址&#xff1a;https://github.com/kubernetes/dashboard 1.下载官方提供的 Dashboard 组件部署的 yaml 文件 wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml也可以使用Kuber…

heap类型

重点思想&#xff1a; 第一轮从k个list中拿出第一个&#xff08;若每个list非空的话&#xff1b;有可能为空&#xff09;放入minheap中&#xff0c;minheap一直储存k个lists中最小的那个数&#xff0c;对顶代表当前最小的数&#xff0c;需要插入result listnode。所有list每个n…

Python heap

原文&#xff1a;https://blog.csdn.net/dta0502/article/details/80834787 堆是一类特殊的树&#xff0c;堆的通用特点就是父节点会大于或小于所有子节点&#xff08;儿子不分左右&#xff09;。一个最小堆&#xff08;min-heap&#xff09;就是其中的每一个节点都小于或等于…

Stack and Heap

JVM 分配内存进入以下区域 1&#xff1a; Heap 2&#xff1a;Stack 3&#xff1a;Code 4&#xff1a;Static jvm有效的管理分配到这几个内存区域。 Code section 代码区 包含这个 字节码文件 (byte code) Stack section (栈区域) 包含 方法&#xff08;methods&a…

堆-heap

priority queue可以借用堆&#xff08;heap&#xff09;,binary heap是一种complete binary tree(完全二叉树&#xff09; 完全二叉树&#xff1a;binary tree除最底层叶节点之外&#xff0c;是填满&#xff0c;最底层叶节点由左到右不得有空隙。 用vector来存储所有节点&…

Kubernetes安装系列之heapster安装

虽然heapster已经即将退休&#xff0c;为了纪念一下&#xff0c;这篇文章整理一下heapstergrafanaInfluxdb组合对于kubernetes的node与资源进行监控的插件安装与设定方法&#xff0c;本文以脚本的方式进行固化&#xff0c;内容仍然放在github的easypack上。 整体操作 https:/…

Heapster -- Kubernetes Dashboard集成Heapster

原始kubernetes dashboard的界面中仅显示了pod一些配置信息&#xff0c;无法图形化展现集群度量指标信息。原始图如下&#xff08;此处从网上找了一个图..&#xff09;&#xff1a; 而如果要展示图形化的集群度量指标信息&#xff0c;就需要安装一个dashboard插件&#xff1a;h…

HeapSort

堆的定义&#xff1a; n个关键字序列K[1....n]称为堆&#xff0c;当且仅当改序列满足&#xff1a; 第一种为&#xff1a;小根堆&#xff1a;每个结点的值都小于或等于左右孩子结点 第二种为&#xff1a;大根堆&#xff1a;每个结点的值都大于或等于左右孩子结点 堆是一种完全二…

heap.h

上一篇写了写链表&#xff0c;这篇写下堆&#xff0c;这个结构接触的不多&#xff0c;所以正好学习一下libhv中的堆&#xff0c;这个堆的实现比较灵活&#xff0c;即可以是大顶堆也可以是小顶堆&#xff0c;通过比较函数是比大还是比小来区别&#xff0c;当然&#xff0c;如果没…

部署 heapster 插件

说明&#xff1a;本部署文章参照了 https://github.com/opsnull/follow-me-install-kubernetes-cluster &#xff0c;欢迎给作者star Heapster是一个收集者&#xff0c;将每个Node上的cAdvisor的数据进行汇总&#xff0c;然后导到第三方工具(如InfluxDB)。 Heapster 是通过调用…

每天5分钟玩转Kubernetes | Heapster

书籍来源&#xff1a;cloudman《每天5分钟玩转Kubernetes》 一边学习一边整理老师的课程内容及试验笔记&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;每天5分钟玩转Kubernetes | 汇总_COCOgsta的博客-CSDN博客 Heap…

Kubernetes监控Heapster介绍

什么是Heapster&#xff1f; Heapster是容器集群监控和性能分析工具&#xff0c;天然的支持Kubernetes和CoreOS。 Kubernetes有个出名的监控agent—cAdvisor。在每个kubernetes Node上都会运行cAdvisor&#xff0c;它会收集本机以及容器的监控数据(cpu,memory,filesystem,netw…

nginx部署https域名

目录 一、准备工作 二、部署项目 三、修改nginx的配置文件 一、准备工作 1、首先你要有一台服务器&#xff0c;本篇文章是创建在腾讯云服务器的基础上的&#xff0c;仅供参考 2、在服务器上注册域名&#xff0c;这个域名注册等待审核时间较长&#xff0c;建议提早注册&…

域名解析与nginx配置

dns解析 阿里云服务器dns域名解析配置&#xff0c;记录值就是阿里云服务器的ip nginx配置 远程到阿里云服务器上对nginx进行配置&#xff1a; nginx反向代理配置&#xff1a; 修改配置后&#xff0c;重启nginx服务 进入目录&#xff1a;cd /usr/sbin 强制杀死进程&#xff…

linux nginx部署项目配置域名

一.把项目打包&#xff08;jar&#xff09; 二.把jar包通过xshell上传 三.编辑nginx.conf文件&#xff0c;配置域名&#xff0c;每配置一个域名就复制一份里面的server 1 代表你所要配置的域名 2 代表你项目浏览器访问路径 四.在项目上传的目录下&#xff08;jar包所放的位…

Docker部署nginx、配置域名

文章目录 背景1. 拉取nginx镜像2. 启动nginx3. 通过docker修改nginx配置1) 挂载配置文件2) 重新加载配置文件 4. 配置我的域名小结 背景 docker 容器相关技术已经成为了现在开发和运维人员的热门技术之一&#xff0c;docker就像一个集装箱能够将各种应用放入到集装箱里的盒子里…

nginx配置域名访问/禁止ip访问

一 背景 为什么要禁止ip访问? 为了避免其他人把未备案的域名解析到自己的服务器IP&#xff0c;而导致服务器被断网&#xff0c;我们可以通过禁止使用ip访问的方法&#xff0c;防止此类事情的发生。 二 解决方法 修改配置文件nginx.conf, 其中2.2的方法可以参考 ubuntu18.04…

配置nginx域名转发

这应该是&#xff0c;我在这个网站的最后一篇博客了。 国庆的时候不知道为什么突然买了个服务器&#xff0c;我打算自己建一个博客网站了&#xff0c;然后前两天域名刚备案成功&#xff0c;晚上有空就配置服务器。 服务器先安装jdk&#xff0c;jre基础环境&#xff0c;然后ngi…