Java 中 HashSet 的 removeAll 性能分析

article/2025/11/8 10:31:47

在这里插入图片描述

1. 概述

HashSet是一个用于存储唯一元素的集合。

在本文中,我们将讨论java.util.HashSet 类中removeAll()方法 的性能。

2. HashSet.removeAll()

HashSet 的 removeAll 方法删除所有包含指定集合的元素:

Set<Integer> set = new HashSet<Integer>();
set.add(1);
set.add(2);
set.add(3);
set.add(4);Collection<Integer> collection = new ArrayList<Integer>();
collection.add(1);
collection.add(3);set.removeAll(collection);Integer[] actualElements = new Integer[set.size()];
Integer[] expectedElements = new Integer[] { 2, 4 };
assertArrayEquals(expectedElements, set.toArray(actualElements));

结果,原集合里的元素 1 和 3 将被中删除。

3. 内部实现和时间复杂度

removeAll()方法会先确定哪个集合更小,集合大小不同,执行逻辑不同。这是通过在原集合和指定集合上调用size() 方法来完成的。

如果指定集合的元素少于指定原的元素,则它以时间复杂度O( n )迭代指定的集合。它还检查元素是否存在于时间复杂度为 O(1) 的集合中。如果元素存在,则使用集合的remove()方法将其从原集合中 删除,该方法的时间复杂度为 O(1)。所以总的时间复杂度是 O( n )

如果原集合的元素少于指定集合,则它使用 O( n )迭代此原集合。然后它通过调用其contains()方法检查指定集合中是否存在每个元素。如果存在这样的元素,则从原集合中删除该元素。所以这取决于contains()方法的时间复杂度。

现在在这种情况下,如果指定集合是一个ArrayList,contains()方法的时间复杂度是 O( m )。因此,从集合HashSet中删除ArrayList 中存在的所有元素的总体时间复杂度为 O( n * m )

如果指定集合再次是HashSet,则contains()方法的时间复杂度为 O(1)。因此,从集合HashSet中删除HashSet 中存在的所有元素的总体时间复杂度为 O( n )

4. 性能

为了查看以上3种情况的性能差异,我们来编写一个简单的JMH基准测试。

对于第一种情况,我们将初始化原集合和指定集合,其中原集合中的元素多于指定集合。在第二种情况下,指定集合中的元素多于原集合。在第三种情况下,第二个集合的元素数量比第一个集合多:

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 5)
public class HashSetBenchmark {@State(Scope.Thread)public static class MyState {private Set employeeSet1 = new HashSet<>();private List employeeList1 = new ArrayList<>();private Set employeeSet2 = new HashSet<>();private List employeeList2 = new ArrayList<>();private Set<Employee> employeeSet3 = new HashSet<>();private Set<Employee> employeeSet4 = new HashSet<>();private long set1Size = 60000;private long list1Size = 50000;private long set2Size = 50000;private long list2Size = 60000;private long set3Size = 50000;private long set4Size = 60000;@Setup(Level.Trial)public void setUp() {// populating sets}}
}

之后,我们添加我们的基准测试:

@Benchmark
public boolean given_SizeOfHashsetGreaterThanSizeOfCollection_whenRemoveAllFromHashSet_thenGoodPerformance(MyState state) {return state.employeeSet1.removeAll(state.employeeList1);
}@Benchmark
public boolean given_SizeOfHashsetSmallerThanSizeOfCollection_whenRemoveAllFromHashSet_thenBadPerformance(MyState state) {return state.employeeSet2.removeAll(state.employeeList2);
}@Benchmark
public boolean given_SizeOfHashsetSmallerThanSizeOfAnotherHashSet_whenRemoveAllFromHashSet_thenGoodPerformance(MyState state) {return state.employeeSet3.removeAll(state.employeeSet4);
}

结果如下:

Benchmark                                              Mode  Cnt            Score            Error  Units
HashSetBenchmark.testHashSetSizeGreaterThanCollection  avgt   20      2700457.099 ±     475673.379  ns/op
HashSetBenchmark.testHashSetSmallerThanCollection      avgt   20  31522676649.950 ± 3556834894.168  ns/op
HashSetBenchmark.testHashSetSmallerThanOtherHashset    avgt   20      2672757.784 ±     224505.866  ns/op

我们可以看到当HashSet的元素少于Collection 时,HashSet.removeAll() 的表现非常糟糕,Collection作为参数传递给removeAll()方法。但是当另一个集合再次是HashSet 时,则性能很好。

5. 结论

在本文中,我们看到了HashSet中removeAll()的性能。当原集合的元素少于集合的元素时,removeAll()的性能取决于集合的contains()方法的时间复杂度。

最后,本文的完整代码可 在 GitHub 上找到。

参考: https://www.baeldung.com/java-hashset-removeall-performance


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

相关文章

Python爬虫案例解析:五个实用案例及代码示例(学习爬虫看这一篇文章就够了)

导言&#xff1a; Python爬虫是一种强大的工具&#xff0c;可以帮助我们从网页中抓取数据&#xff0c;并进行各种处理和分析。在本篇博客中&#xff0c;我们将介绍五个实用的Python爬虫案例&#xff0c;并提供相应的代码示例和解析。通过这些案例&#xff0c;读者可以了解如何应…

python爬虫实验总结_python爬虫总结

python2转成python3的问题: 使用python3下边的2to3.py 打开cmd,进到python安装目录下的 \Tools\scripts文件夹中 输入python 2to3.py -w 目标py文件路径/目标.py 通过这种方式可以将一些格式的区别进行转化。 import格式的区别: py2和py3的import机制不同,详情可以百度…

利用Python爬虫技术爬取京东商品评论

这是我第一次接触python时&#xff0c;我们学校做的项目实训&#xff0c;其实整个项目实训过程很简单&#xff0c;并没有什么难度&#xff0c;认真学学就会。 首先&#xff0c;我们要明确我们的目标&#xff1a;从京东上爬取产品的评论。一般评论都是进行情感分析&#xff0c;但…

通过Python爬虫技术获取小说信息

资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/85673772 实验目的 使用Python爬虫技术获取小说信息&#xff0c;包括小说名称、小说作者以及小说简介等作品信息&#xff01;在实验中掌握Python的第三方库requests和lxml 实验内容 明确实验需求—…

Python爬虫详解

从今天开始&#xff0c;给大家介绍Python爬虫相关知识&#xff0c;今天主要内容是爬虫的基础理论知识。 一、爬虫简介 爬虫是指通过编写程序&#xff0c;来模拟浏览器访问Web网页&#xff0c;然后通过一定的策略&#xff0c;爬取指定内容。因此&#xff0c;爬虫的编写通常分为…

python爬虫技术简介-python网络爬虫---简介与认识HTTP

一、python爬虫环境与简介 二、认识HTTP 三、简单静态网页爬取 四、常规动态网页爬取 五、模拟登陆 六、PC客户端抓包 七、Scrapy爬虫 一、python爬虫环境与简介 1、认识爬虫 &#xff08;1&#xff09;爬虫的概念 网络爬虫也被称为网络蜘蛛、网络机器人&#xff0c;…

python 爬虫总结

requests模块 import reqeusts # get 请求 # 网址 url_login "url://123.com"# 请求头 headers {User-Agent: Apipost client Runtime/https://www.apipost.cn/ }# 参数&#xff0c;形式字典 kw {key:value} response reqeusts.get(urlurl_login,paramskw)# pos…

Python爬虫介绍

一、什么是爬虫 爬虫&#xff1a;一段自动抓取互联网信息的程序&#xff0c;从互联网上抓取对于我们有价值的信息 二、Python爬虫架构 Python爬虫架构主要由五个部分组成&#xff0c;分别是调度器、URL管理器、网页下载器、网页解析器、应用程序&#xff08;爬取的有价值数据…

Python实用技术——爬虫(一):爬虫基础

目录 爬虫这门技术本身是不违法的&#xff0c;但是应该注意&#xff1a; 1&#xff0c;爬取什么数据 2&#xff0c;如何爬取得来的 3&#xff0c;爬取之后如何使用 二&#xff0c;HTTP协议 1&#xff0c;万维网 2&#xff0c;协议&#xff1a; 三&#xff0c;HTTP知识 …

Python爬虫讲解(超详细)

Python爬虫是一种通过编写程序自动从互联网上获取数据的技术。下面是Python爬虫的详解&#xff1a; 爬虫的基本原理 爬虫的基本原理是**通过模拟浏览器的行为**&#xff0c;访问目标网站&#xff0c;并获取目标页面中的数据。Python爬虫可以使用requests库来发送HTTP请求&…

python爬虫技术整理

Python爬虫——新闻热点爬取 显示更多 可以看到相关的数据接口&#xff0c;里面有新闻标题以及新闻详情的url地址 如何提取url地址 1、转成json&#xff0c;键值对取值&#xff1b; 2、用正则表达式匹配url地址&#xff1b;根据接口数据链接中的pager 变化进行翻页&#xf…

Pytorch创建多任务学习模型

在机器学习中&#xff0c;我们通常致力于针对单个任务&#xff0c;也就是优化单个指标。但是多任务学习(MTL)在机器学习的许多应用中都取得了成功&#xff0c;从自然语言处理和语音识别到计算机视觉和药物发现。 MTL最著名的例子可能是特斯拉的自动驾驶系统。在自动驾驶中需要…

多任务学习 Pytorch实现

多任务学习MTL的简单实现&#xff0c;主要是为了理解MTL 代码写得挺烂的&#xff0c;有时间回来整理一下 import torch import torch.nn as nn import torchvision import torchvision.transforms as transforms import numpy as np import matplotlib.pyplot as plt import ma…

【综述】多任务学习

前言 本文对多任务学习(multi-task learning, MTL)领域近期的综述文章进行整理&#xff0c;从模型结构和训练过程两个层面回顾了其发展变化&#xff0c;旨在提供一份 MTL 入门指南&#xff0c;帮助大家快速了解多任务学习的进化史。 1. 什么是多任务学习&#xff1f; 多任务学习…

多任务学习原理与优化

文章目录 一、什么是多任务学习二、为什么我们需要多任务学习三、多任务学习模型演进Hard shared bottom 硬共享Soft shared bottom 软共享软共享&#xff1a; MOE & MMOE软共享&#xff1a; CGC & PLE加入FMMMOE/PLE 的调参ESMM 四、 loss权重1&#xff0c; 利用任务的…

【多任务学习-Multitask Learning概述】

多任务学习-Multitask Learning概述 1.单任务学习VS多任务学习多任务学习的提出多任务学习和单任务学习对比 2.多任务学习共享表示shared representation&#xff1a;多任务学习的优点那么如何衡量两个任务是否相关呢&#xff1f; 当任务之间相关性弱多任务MLP特点总结多任务学…

多任务学习(Multi-Task Learning, MTL)

目录 [显示] 1 背景2 什么是多任务学习&#xff1f;3 多任务学习如何发挥作用&#xff1f; 3.1 提高泛化能力的潜在原因3.2 多任务学习机制3.3 后向传播多任务学习如何发现任务是相关的4 多任务学习可被广泛应用&#xff1f; 4.1 使用未来预测现在4.2 多种表示和度量4.3 时间序…

Tensorflow 多任务学习

之前在caffe上实现了两个标签的多任务学习&#xff0c;如今换到了tensorflow&#xff0c;也想尝试一下&#xff0c;总的来说也不是很复杂。 建立多任务图 多任务的一个特点是单个tensor输入(X)&#xff0c;多个输出(Y_1,Y_2...)。因此在定义占位符时要定义多个输出。同样也需要…

多任务学习:Multi-Task Learning as Multi-Objective Optimization

前言 最近在写一篇文章&#xff0c;是一篇深度学习与安全相结合的文章&#xff0c;模型的输出会交给两个损失函数&#xff08;availability & security&#xff09;进行损失计算&#xff0c;进而反向传播。起初的想法是直接将两项损失进行加权平均&#xff0c;共同进行反向…

深度学习中的多任务学习(一)

任务学习-Multitask Learning概述 Reference https://blog.csdn.net/u010417185/article/details/83065506 1、单任务学习VS多任务学习 单任务学习&#xff1a;一次只学习一个任务&#xff08;task&#xff09;&#xff0c;大部分的机器学习任务都属于单任务学习。多任务学习…