List数组高效率去重

news2024/11/23 8:14:34

List数组高效率去重

一、环境准备–生成包含重复元素的list数组

/**
 * 生成包含重复元素的list数组
 * @return
 */
private static List<String> getList(){
    List<String> list = new ArrayList<>();
    for (int i = 1; i <= 10000; i++) {
        list.add(String.valueOf(i));
    }
    for (int i = 10000; i >= 1; i--) {
        list.add(String.valueOf(i));
    }
    return list;
}

二、常规方法–使用list.contains()方法去重

代码实现:

/**
 * 使用 list.contains() 方法去重
 * @param testList
 */
private static void useListContains(List<String> testList){
    System.out.println("contains 开始去重,条数:" + testList.size());
    List<String> list = new ArrayList<>();
    for (String str : testList) {
        if (!list.contains(str)) {
            list.add(str);
        }
    }
    System.out.println("contains 去重完毕,条数:" + list.size());
}

测试该方法去重时长:

public static void main(String[] args) {
    StopWatch stopWatch = new StopWatch();
    // 生成list
    List<String> list = getList();
    stopWatch.start();
    // 常规去重,采用list.contain()
    useListContains(list);
    stopWatch.stop();
    System.out.println("去重共耗时: " + stopWatch.getTotalTimeMillis());
}

结果如下:

在这里插入图片描述

list.contains()去重原理:
在这里插入图片描述

以上是ArrayListcontains源码的查重逻辑,从源码中我们能看出contains方法采用的是for循环遍历数组的方式进行元素的逐一对比,时间复杂度为O(n).

三、高效方法–使用HashSet特性去重

代码实现:

/**
 * 使用 hashSet的值不能重复的特性去重
 * @param testList
 */
private static void useHashSet(List<String> testList){
    System.out.println("hashSet 开始去重,条数:" + testList.size());
    List<String> list = new ArrayList<>(new HashSet<>(testList));
    System.out.println("hashSet 去重完毕,条数:" + list.size());
}

测试该方法去重时长:

public static void main(String[] args) {
    StopWatch stopWatch = new StopWatch();
    // 生成list
    List<String> list = getList();
    stopWatch.start();
    // hashSet去重
    useHashSet(list);
    stopWatch.stop();
    System.out.println("去重共耗时: " + stopWatch.getTotalTimeMillis());
}

结果如下:
在这里插入图片描述

HashSet特性去重原理:

在这里插入图片描述

new HashSet<>(testList)

新建HashSet对象时采用的的是add方法,此处涉及到HashSet的底层原理,当值相同时,则会添加相同存放位置的链表或者红黑树上,匹对的方法也是直接使用equal方法进行判断,所以使用HashSet特性进行去重的时间复杂度为O(1).

顺带提一句,HashMapcontainsKey方法查询key是否重复的过程时间复杂度也是O(1)

如果不清楚HashSet底层原理的,可直接通过一下链接了解,图示较为简洁清楚。
HashSet底层原理

四、总结

ArrayListcontains去重时间复杂度为O(n)

HashSet特性去重的时间复杂度为O(1)

综上,可以得出HashSet特性去重效率远高于ArrayListcontains去重方法,而且随着查重参数越多,两者的时间差越明显。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kendo UI for jQuery---03.组件___网格---02.开始

网格入门 本指南演示了如何启动和运行 Kendo UI for jQuery Grid。 完成本指南后&#xff0c;您将能够实现以下最终结果&#xff1a; 1. 创建一个空的 div 元素 首先&#xff0c;在页面上创建一个空元素&#xff0c;该元素将用作 Grid 组件的主容器。 <div id"my-…

SpringMVC组件原理剖析

文章目录 SpringMVC组件原理剖析一、 前端控制器初始化1.1 初始化SpringMVC容器1.2 注册了 SpringMVC的 九大组件1.3 处理器映射器初始化细节 二、前端控制器执行主流程2.1 定位doDispatcher方法2.2 验证HandlerExecutionChain2.3 HandlerAdapter执行目标方法 SpringMVC组件原理…

64位和32位相比优势是什么(一)

前置知识&#xff1a;程序是如何执行的&#xff1f; 一道常规的面试题&#xff1a;相比 32 位&#xff0c;64 位的优势是什么&#xff1f; 面试官考察这种类型的问题&#xff0c;主要是想看求职者是否有扎实的计算机基础&#xff0c;同时想知道求职者在工作中是否充满好奇&am…

路径规划算法:基于未来搜索优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于未来搜索优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于未来搜索优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

【硬件专题】案例:怎么通过元件丝印信息反查芯片

今天同事和昨天因为工作上的原因,问我一个问题,就是怎么通过丝印(Marking code)知道用的是什么芯片。以下列举几个方法: 凭经验 比如昨天给出的一张图片,看图片是比较模糊的。但是根据之前的使用,看芯片LOGO很明显是ST的,然后看上面的型号是STM**F1*VCT*,那么…

Go语言环境安装和程序结构

Go语言环境安装和程序结构 1、Go环境安装 Go安装包下载地址为&#xff1a; https://golang.org/dl/ https://golang.google.cn/dl/ 1.1 Windows下的安装 Windows 下可以使用.msi 后缀的安装包来安装&#xff0c;我这里下载的安装包是 go1.18.4.windows-amd64.msi&#xf…

C\C++ Thread-

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan 简介 说明 时间 c语言的时间处理&#xff1a;time.h 获取从1970年1月1日到当前经过的秒数: long t0 time(NULL); 让程序暂停3秒&#xff1a; sleep(3); 当前时间的3秒后&#x…

Pycharm 通过 SVN 直接管理控制代码,原来这么方便又高级!

做自动化测试的小伙伴都知道&#xff0c;代码不会只放到本地管理&#xff0c;需要托管到远端进行管理&#xff01; 一方面&#xff0c;发布在不同的电脑上进行同步开发&#xff0c;不需要用U盘拷来拷去&#xff1b;另外一方面&#xff0c;可以轻松找回代码&#xff0c;避免本地…

【UE】玻璃材质

效果 步骤 1. 新建一个材质&#xff0c;这里命名为“M_GLASS” 双击打开“M_GLASS”&#xff0c;左下角混合模式设置为半透明 光照模式设置为表面前向着色 将基础颜色提升为参数 同样还需提升为参数的有“高光度”、“粗糙度”、“不透明度”、“折射” 设置高光度的默认值和最…

【软件测试面试】几句话让面试官再掏3K,轻松应对测试面试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试官&#xff1…

查看网卡中断在哪个CPU核处理

本文目录 1、查看CPU占用率2、查看系统的中断处理在各个CPU核间的分布情况3、查看用于处理网卡中断的CPU核4、修改用于处理网卡中断的CPU核 在默认的情况下Linux默认一个网卡的中断操作都在一个CPU核里处理&#xff0c;在大数据量或者说是对网卡的收发包性能PPS进行测试时&…

2023-06-13:统计高并发网站每个网页每天的 UV 数据,结合Redis你会如何实现?

2023-06-13&#xff1a;统计高并发网站每个网页每天的 UV 数据&#xff0c;结合Redis你会如何实现&#xff1f; 答案2023-06-13&#xff1a; 选用方案&#xff1a;HyperLogLog 如果统计 PV &#xff08;页面浏览量&#xff09;那非常好办&#xff0c;可以考虑为每个网页创建…

像医生一样的大规模AI模型

目录 华佗&#xff1a;BenTsao相关工作华佗模型实验 HuatuoGPT动机解决方案混合数据的SFT基于AI反馈的RL 医学中的LLM指令微调 华佗&#xff1a;BenTsao 大型语言模型&#xff08;LLM&#xff09;&#xff0c;如LLaMA模型&#xff0c;已经证明了它们在各种通用领域自然语言处理…

《代码随想录》(8)反转链表

LeeCode题号&#xff1a; 206 【题目描述】 给你单链表的头节点 head&#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 【示例1】 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]【示例2】 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]【示…

实现Vue3和UE5.2进行通信(Pixel Streaming)

文章目录 1. 从UE5.2到前端页面的通信1.1 编写蓝图脚本1.2 编写前端的响应函数1.3 功能验证 2. 从Vue3到UE5.2的信息发送2.1 UE5.2蓝图的设计2.2 前端发送消息功能的实现2.3 功能验证 3. 参考资源 这篇文章简单讲解一下如何实现vue3和UE5进行数据的通信。 如果有同学还不清楚如…

3.数据操作

SQL句子中语法格式提示&#xff1a; 1.中括号&#xff08;[]&#xff09;中的内容为可选项&#xff1b; 2.[&#xff0c;...]表示&#xff0c;前面的内容可重复&#xff1b; 3.大括号&#xff08;{}&#xff09;和竖线&#xff08;|&#xff09;表示选择项&#xff0c;在选择…

Jenkins集成钉钉通知插件的具体步骤怎么做你知道吗?

最近公司要求工作务必使用钉钉&#xff0c;其他聊天软件不再用于工作沟通了。虽然很抓狂&#xff0c;但是上面的决定不可违逆&#xff0c;只好转战钉钉。虽然强制使用钉钉挺令人反感的&#xff0c;但阿里在这款软件上确实下了些功夫&#xff0c;比如jenkins集成钉钉通知插件后&…

(原创)自定义控件:写一个瀑布流效果

效果展示 最近要业务中需要做一个瀑布流的效果&#xff0c;按理说正常的瀑布流网上已经有很多解决方案了。 但我还是想自己尝试写一下。 又因为这块要求有一点特殊&#xff0c;下面大概讲下需求&#xff1a; 首先子元素的对方肯定还是和其他瀑布流一样&#xff0c;按照子View的…

对任意给定的NFA M进行确定化操作(附详细注释)

对任意给定的NFA M进行确定化操作&#xff08;附详细注释&#xff09; DFA实体类 package Beans;import java.util.List;public class DFA {private List<Integer> K; // 状态集private char[] letters; // 字母表private String[][] f; // 转换函数priva…

每天五分钟机器学习:梯度下降的学习率太大或太小会有什么问题?

本文重点 我们前面学习了梯度下降算法,其中有一个重要的参数就是学习率。在使用梯度下降算法时,学习率是一个非常重要的参数。学习率的大小会直接影响梯度下降算法的收敛速度和精度。如果学习率太大或太小,都会对梯度下降算法的表现产生负面影响。 学习率太大的影响 学习率…