当前位置: 首页 > news >正文

list集合常见去重方式以及效率对比

1.概述

        list集合去重是开发中比较常用的操作,在面试中也会经常问到,那么list去重都有哪些方式?他们之间又该如何选择呢?

        本文将通过LinkedHashSet、for循环、list流toSet、list流distinct等4种方式分别做1W数据到1000W数据单元测试,对比去重效率

2.代码实现

        2.1准备工作

          构建list集合,往里面插入数据,在插入几条重复数据,用jdk自带的System.currentTimeMillis()做计时器。

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.stream.Collectors;public class Test {public static void main(String[] args) {List<String> list1 = initList(10000);test(list1);List<String> list2 = initList(50000);test(list2);List<String> list3 = initList(100000);test1(list3);List<String> list4 = initList(500000);test1(list4);List<String> list5 = initList(1000000);test1(list5);List<String> list6 = initList(2000000);test1(list6);List<String> list7 = initList(3000000);test1(list7);List<String> list8 = initList(5000000);test1(list8);List<String> list9 = initList(10000000);test1(list9);}public static List<String> initList(int num){System.out.println("--------------------------");final List<String> list = new ArrayList<>();for (int i = 0; i < num; i++) {list.add("haha-"+ i);}list.add("haha-"+ 1000);list.add("haha-"+ 2000);list.add("haha-"+ 3000);System.out.println("list 初始化完毕 size = " + list.size());return list;}public static void test(List<String> list){long startLong = System.currentTimeMillis();List<String> list1 = removeDuplicate(list);System.out.println("去重后,集合元素个数 :" + list1.size());long endLong = System.currentTimeMillis();System.out.println("LinkedHashSet 测试完毕,实际耗时:"+ (endLong-startLong)  +" ,ms");long startLong1 = System.currentTimeMillis();List<String> list2 = removeDuplicate1(list);System.out.println("去重后,集合元素个数 :" + list2.size());long endLong1 = System.currentTimeMillis();System.out.println("for增强型循环 测试完毕,实际耗时:"+ (endLong1-startLong1)  +" ,ms");long startLong2 = System.currentTimeMillis();List<String> list3 = removeDuplicate2(list);System.out.println("去重后,集合元素个数 :" + list3.size());long endLong2 = System.currentTimeMillis();System.out.println("list流toSet方式 测试完毕,实际耗时:"+ (endLong2-startLong2)  +" ,ms");long startLong3 = System.currentTimeMillis();List<String> list4 = removeDuplicate3(list);System.out.println("去重后,集合元素个数 :" + list4.size());long endLong3 = System.currentTimeMillis();System.out.println("list流distinct方式 测试完毕,实际耗时:"+ (endLong3-startLong3)  +" ,ms");System.out.println("--------------------------");}public static void test1(List<String> list){long startLong = System.currentTimeMillis();List<String> list1 = removeDuplicate(list);System.out.println("去重后,集合元素个数 :" + list1.size());long endLong = System.currentTimeMillis();System.out.println("LinkedHashSet 测试完毕,实际耗时:"+ (endLong-startLong)  +" ,ms");long startLong2 = System.currentTimeMillis();List<String> list3 = removeDuplicate2(list);System.out.println("去重后,集合元素个数 :" + list3.size());long endLong2 = System.currentTimeMillis();System.out.println("list流toSet方式 测试完毕,实际耗时:"+ (endLong2-startLong2)  +" ,ms");long startLong3 = System.currentTimeMillis();List<String> list4 = removeDuplicate3(list);System.out.println("去重后,集合元素个数 :" + list4.size());long endLong3 = System.currentTimeMillis();System.out.println("list流distinct方式 测试完毕,实际耗时:"+ (endLong3-startLong3)  +" ,ms");System.out.println("--------------------------");}private static List<String> removeDuplicate(List<String> list) {return new ArrayList<>(new LinkedHashSet<>(list));}private static List<String> removeDuplicate1(List<String> list) {List<String> result = new ArrayList<String>(list.size());for (String str : list) {if (!result.contains(str)) {result.add(str);}}return result;}private static List<String> removeDuplicate2(List<String> list) {return list.stream().collect(Collectors.toSet()).stream().collect(Collectors.toList());}private static List<String> removeDuplicate3(List<String> list) {return  list.stream().distinct().collect(Collectors.toList());}}

        2.2输出结果

--------------------------
list 初始化完毕 size = 10003
去重后,集合元素个数 :10000
LinkedHashSet 测试完毕,实际耗时:7 ,ms
去重后,集合元素个数 :10000
for增强型循环 测试完毕,实际耗时:342 ,ms
去重后,集合元素个数 :10000
list流toSet方式 测试完毕,实际耗时:89 ,ms
去重后,集合元素个数 :10000
list流distinct方式 测试完毕,实际耗时:5 ,ms
--------------------------
--------------------------
list 初始化完毕 size = 50003
去重后,集合元素个数 :50000
LinkedHashSet 测试完毕,实际耗时:12 ,ms
去重后,集合元素个数 :50000
for增强型循环 测试完毕,实际耗时:6059 ,ms
去重后,集合元素个数 :50000
list流toSet方式 测试完毕,实际耗时:12 ,ms
去重后,集合元素个数 :50000
list流distinct方式 测试完毕,实际耗时:5 ,ms
--------------------------
--------------------------
list 初始化完毕 size = 100003
去重后,集合元素个数 :100000
LinkedHashSet 测试完毕,实际耗时:14 ,ms
去重后,集合元素个数 :100000
list流toSet方式 测试完毕,实际耗时:13 ,ms
去重后,集合元素个数 :100000
list流distinct方式 测试完毕,实际耗时:13 ,ms
--------------------------
--------------------------
list 初始化完毕 size = 500003
去重后,集合元素个数 :500000
LinkedHashSet 测试完毕,实际耗时:101 ,ms
去重后,集合元素个数 :500000
list流toSet方式 测试完毕,实际耗时:40 ,ms
去重后,集合元素个数 :500000
list流distinct方式 测试完毕,实际耗时:34 ,ms
--------------------------
--------------------------
list 初始化完毕 size = 1000003
去重后,集合元素个数 :1000000
LinkedHashSet 测试完毕,实际耗时:75 ,ms
去重后,集合元素个数 :1000000
list流toSet方式 测试完毕,实际耗时:93 ,ms
去重后,集合元素个数 :1000000
list流distinct方式 测试完毕,实际耗时:162 ,ms
--------------------------
--------------------------
list 初始化完毕 size = 2000003
去重后,集合元素个数 :2000000
LinkedHashSet 测试完毕,实际耗时:140 ,ms
去重后,集合元素个数 :2000000
list流toSet方式 测试完毕,实际耗时:2807 ,ms
去重后,集合元素个数 :2000000
list流distinct方式 测试完毕,实际耗时:231 ,ms
--------------------------
--------------------------
list 初始化完毕 size = 3000003
去重后,集合元素个数 :3000000
LinkedHashSet 测试完毕,实际耗时:177 ,ms
去重后,集合元素个数 :3000000
list流toSet方式 测试完毕,实际耗时:654 ,ms
去重后,集合元素个数 :3000000
list流distinct方式 测试完毕,实际耗时:417 ,ms
--------------------------
--------------------------
list 初始化完毕 size = 5000003
去重后,集合元素个数 :5000000
LinkedHashSet 测试完毕,实际耗时:307 ,ms
去重后,集合元素个数 :5000000
list流toSet方式 测试完毕,实际耗时:6364 ,ms
去重后,集合元素个数 :5000000
list流distinct方式 测试完毕,实际耗时:711 ,ms
--------------------------
--------------------------
list 初始化完毕 size = 10000003
去重后,集合元素个数 :10000000
LinkedHashSet 测试完毕,实际耗时:738 ,ms
去重后,集合元素个数 :10000000
list流toSet方式 测试完毕,实际耗时:1790 ,ms
去重后,集合元素个数 :10000000
list流distinct方式 测试完毕,实际耗时:1746 ,ms
--------------------------

3.总结

        3.1 for循环方式去重(谨慎使用)

                原因有2点:1.代码不简洁;2.耗时随着数据增大性能显著增高

        3.2 LinkedHashSet(推荐)

                LinkedHashSet是jdk自带的,所以jdk所有版本都支持使用,按照测试结果来说,对于方便和性能要求不那么极限的来说无脑使用LinkedHashSet是最方便的的。list流distinct在70w数据以下都会比LinkedHashSet效率高。

        3.3 list流toSet(不推荐)

                按照测试结果,list流的toSet方式在不同数据量的效率有很大的波动,且在任意测试节点都没有LinkedHashSet或者list流distinct效率高,所以也不推荐使用。

        3.4 list流distinct(推荐)

                list流是jdk8及以上提供的特性,在实际场景中,去重数据量超过10W基本没有,只要jdk支持list流那么使用list流distinct

        综上:遵循jdk8以下用LinkedHashSet,jdk8及以上用list流distinct

相关文章:

list集合常见去重方式以及效率对比

1.概述 list集合去重是开发中比较常用的操作&#xff0c;在面试中也会经常问到&#xff0c;那么list去重都有哪些方式&#xff1f;他们之间又该如何选择呢&#xff1f; 本文将通过LinkedHashSet、for循环、list流toSet、list流distinct等4种方式分别做1W数据到1000W数据单元测试…...

JavaWeb——Web入门(7/9)-Tomcat-介绍(Tomcat 的简介:轻量级Web服务器,支持Servlet/JSP少量JavaEE规范)

目录 Web服务器的作用 三个方面的讲解 Tomcat 的简介 小结 Web服务器的作用 封装 HTTP 协议操作&#xff1a;Web服务器是一个软件程序&#xff0c;对 HTTP 协议的操作进行了封装。这样开发人员就不需要再直接去操作 HTTP 协议&#xff0c;使得外部应用程序的开发更加便捷、…...

【SpringBoot】19 文件/图片下载(MySQL + Thymeleaf)

Git仓库 https://gitee.com/Lin_DH/system 介绍 从 MySQL 中&#xff0c;下载保存的 blob 格式的文件。 代码实现 第一步&#xff1a;配置文件 application.yml spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT8datasource:driver-class-name: com.mysql.…...

陪诊问诊APP开发实战:基于互联网医院系统源码的搭建详解

时下&#xff0c;开发一款功能全面、用户体验良好的陪诊问诊APP成为了医疗行业的一大热点。本文将结合互联网医院系统源码&#xff0c;详细解析陪诊问诊APP的开发过程&#xff0c;为开发者提供实用的开发方案与技术指导。 一、陪诊问诊APP的背景与功能需求 陪诊问诊APP核心目…...

Spark 中 RDD 的诞生:原理、操作与分区规则

Spark 的介绍与搭建&#xff1a;从理论到实践-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式之Yarn模式的原…...

c++构造与析构

构造函数特性 名称与类名相同&#xff1a;构造函数的名称必须与类名完全相同&#xff0c;并且不能有返回值类型&#xff08;包括void&#xff09;。 自动调用&#xff1a;构造函数在对象实例化时自动调用&#xff0c;不需要手动调用。 初始化成员变量&#xff1a;构造函数的主…...

C++(函数重载,引用,nullptr)

1.函数重载 C⽀持在同⼀作⽤域中出现同名函数&#xff0c;但是要求这些同名函数的形参不同&#xff0c;可以是参数个数不同或者类型不同。传参时会自动匹配传入的参数&#xff0c;对应该函数的形参类型&#xff0c;进行函数调用&#xff0c;这样C函数调⽤就表现出了多态⾏为&a…...

django+postgresql

PostgreSQL概述 PostgreSQL 是一个功能强大的开源关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;以其高度的稳定性、扩展性和社区支持而闻名。PostgreSQL 支持 SQL 标准并具有很多先进特性&#xff0c;如 ACID 合规、复杂查询、外键支持、事务处理、表分区、JS…...

前端滚动锚点(点击后页面滚动到指定位置)

三个常用方案&#xff1a;1.scrollintoView 把调用该方法的元素滚动到屏幕的指定位置&#xff0c;中间&#xff0c;底部&#xff0c;或者顶部 优点&#xff1a;方便&#xff0c;只需要获取元素然后调用 缺点&#xff1a;不好精确控制&#xff0c;只能让元素指定滚动到中间&…...

使用SSL加密465端口发送邮件

基于安全考虑&#xff0c;云虚拟主机的25端口默认封闭&#xff0c;如果您有发送邮件的需求&#xff0c;建议使用SSL加密端口&#xff08;465端口&#xff09;来对外发送邮件。本文通过提供.NET、PHP和ASP样例来介绍使用SSL加密端口发送邮件的方法&#xff0c;其他语言的实现思路…...

一些面试题总结(一)

1、string为什么是不可变的&#xff0c;有什么好处 原因&#xff1a; 1、因为String类下的value数组是用final修饰的&#xff0c;final保证了value一旦被初始化&#xff0c;就不可改变其引用。 2、此外&#xff0c;value数组的访问权限为 private&#xff0c;同时没有提供方…...

泄露的文档显示 Google 似乎意识到了 Tensor 处理器存在过热问题

Google 知道其 Tensor 芯片存在一些问题&#xff0c;尤其是在过热和电池寿命方面&#xff0c;显然他们正在努力通过即将推出的代号为"Malibu"的 Tensor G6 来解决这一问题。 Android Authority 泄露的幻灯片显示&#xff0c;过热是基于 Tensor 的 Pixel 手机退换货的…...

python爬虫案例——网页源码被加密,解密方法全过程

文章目录 1、任务目标2、网页分析3、代码编写1、任务目标 目标网站:https://jzsc.mohurd.gov.cn/data/company,该网站的网页源码被加密了,用于本文测验 要求:解密该网站的网页源码,请求网站并返回解密后的明文数据,网页内容如下: 2、网页分析 进入网站,打开开发者模式,…...

2.4_SSRF服务端请求伪造

SSRF服务端请求伪造 定义&#xff1a;服务端请求伪造。是一种攻击者构造请求后&#xff0c;交由服务端发起请求的漏洞&#xff1b; 产生原理&#xff1a;该服务器提供了从其他服务器获取数据的功能&#xff0c;但没有对用户提交的数据做严格校验&#xff1b; 利用条件&#…...

数据分析反馈:提升决策质量的关键指南

内容概要 在当今快节奏的商业环境中&#xff0c;数据分析与反馈已成为提升决策质量的重要工具。数据分析不仅能为企业提供全面的市场洞察&#xff0c;还能帮助管理层深入了解客户需求与行为模式。掌握数据收集的有效策略和工具&#xff0c;企业能够确保获得准确且相关的信息&a…...

一步步安装deeponet的详细教学

1.deepoent官网如下&#xff1a; https://github.com/lululxvi/deeponet 需要下载依赖 1.python3 2.DeepXDE&#xff08;这里安装DeepXDE<0.11.2,这个最方便&#xff09; Optional: For CNN, install Matlab and TensorFlow 1; for Seq2Seq, install PyTorch&#xff0…...

Devops业务价值流:版本发布最佳实践

敏捷开发中&#xff0c;版本由多个迭代构建而成&#xff0c;每个迭代都是产品进步的一环。当版本最后一个迭代完成时&#xff0c;便启动了至关重要的上线流程。版本发布流程与规划流程相辅相成&#xff0c;确保每个迭代在版本中有效循环执行&#xff0c;最终达成产品目标。 本…...

背包问题(三)

文章目录 一、二维费用的背包问题二、潜水员三、机器分配四、开心的金明五、有依赖的背包问题 一、二维费用的背包问题 题目链接 #include<iostream> #include<algorithm> using namespace std; const int M 110; int n,m,kg; int f[M][M];int main() {cin >…...

linux之调度管理(2)-调度器 如何触发运行

一、调度器是如何在程序稳定运行的情况下进行进程调度的 1.1 系统定时器 因为我们主要讲解的是调度器&#xff0c;而会涉及到一些系统定时器的知识&#xff0c;这里我们简单讲解一下内核中定时器是如何组织&#xff0c;又是如何通过通过定时器实现了调度器的间隔调度。首先我们…...

深入理解 Vue 3 中的 Props

深入理解 Vue 3 中的 Props Vue 3 引入了 Composition API 等新特性&#xff0c;组件的定义和使用也变得更为灵活。而在组件通信中&#xff0c;Props&#xff08;属性&#xff09;扮演了重要角色&#xff0c;帮助父组件向子组件传递数据&#xff0c;形成单向的数据流动&#x…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...