当前位置: 首页 > 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…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...