Java去重的终极指南:性能对比与高效实现

news2024/9/29 3:34:42

文章目录

  • 前言
  • 一、使用Set接口
    • 下面是对几种Set实现类的简单介绍及代码示例:
    • 1.HashSet:
    • 2.LinkedHashSet:
    • 3.TreeSet:
  • 二、使用Stream API
  • 三、其他方式
    • 1.使用Collectors.toSet()方法:
    • 配合Stream API的collect()方法,可以将元素收集到一个Set中,自动去重。
    • 2.使用Apache Commons Collections库的CollectionUtils.removeDuplicates()方法:
    • 3.使用Java 8+新特性:
    • 4.使用谷歌的Guava库的Sets.newHashSet()方法:
  • 四、性能对比
  • 总结


前言

在日常的Java开发中,去重是一个常见的操作。对于一个包含重复元素的集合,
我们常常需要去除重复元素,以便进行后续的处理。本文将介绍几种常用的Java去重方式,并进行性能对比。


一、使用Set接口

Set是Java中的一个接口,它的实现类包括HashSet、LinkedHashSet和TreeSet。
由于Set不允许重复元素存在,因此可以通过将数据存储在Set中,自动去除重复元素。

下面是对几种Set实现类的简单介绍及代码示例:

1.HashSet:

使用HashMap实现的Set,不保证元素的顺序,是最快的去重方法。

List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
Set<Integer> set = new HashSet<>(list);

2.LinkedHashSet:

使用LinkedHashMap实现的Set,保证按插入顺序去重。

List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
Set<Integer> set = new LinkedHashSet<>(list);

3.TreeSet:

使用红黑树实现的Set,保证元素有序去重,性能相较HashSet和LinkedHashSet稍慢。

List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
Set<Integer> set = new TreeSet<>(list);

二、使用Stream API

Java 8引入的Stream API提供了便捷的方法链式操作集合元素。
Stream的distinct()方法可以用于去除重复元素。
示例如下:

List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
List<Integer> distinctList = list.stream().distinct().collect(Collectors.toList());

三、其他方式

1.使用Collectors.toSet()方法:

配合Stream API的collect()方法,可以将元素收集到一个Set中,自动去重。

List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
Set<Integer> set = list.stream()
                       .collect(Collectors.toSet());

2.使用Apache Commons Collections库的CollectionUtils.removeDuplicates()方法:

可以去除List中的重复元素。

import org.apache.commons.collections4.CollectionUtils;

List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
CollectionUtils.removeDuplicates(list);

3.使用Java 8+新特性:

例如使用Stream和filter,根据元素自身的某个属性进行去重,或者使用流的distinct()方法配合自定义的比较器去重。

List<Person> personList = Arrays.asList(
    new Person("Alice", 25),
    new Person("Bob", 30),
    new Person("Alice", 25),
    new Person("Charlie", 35)
);

List<Person> distinctList = personList.stream()
                                      .distinct()
                                      .collect(Collectors.toList());

// 自定义比较器去重示例:
List<Person> distinctList = personList.stream()
                                      .filter(
                                          new HashSet<>(
                                              ConcurrentHashMap.newKeySet()
                                          )::add
                                      ).collect(Collectors.toList());

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 省略getter和setter方法

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person person = (Person) obj;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

4.使用谷歌的Guava库的Sets.newHashSet()方法:

将集合转换为HashSet,自动去重。

import com.google.common.collect.Sets;

List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
Set<Integer> set = Sets.newHashSet(list);

四、性能对比

在性能方面,HashSet是最快的去重方式,它的底层使用散列表实现。
LinkedHashSet和TreeSet则相对较慢,因为它们维护了元素的插入顺序或者有序性。
使用Stream API的distinct()方法和Collectors.toSet()方法在性能上比较接近,具体取决于集合的大小和元素的重复程度。
根据实际情况选择合适的去重方式,可以提高代码的可读性和性能。
在处理大量数据时,需要根据具体场景进行性能测试和优化,选择适合的数据结构和算法。

总结

本文介绍了Java中几种常用的去重方式,包括使用Set接口、Stream API、Apache Commons Collections库等。根据实际需求和性能考量选择合适的方法,可以提高程序的效率和可维护性,满足各种去重需求。
希望本文能够帮助读者更好地理解Java中去重操作,并在实际开发中得到应用和启发。
(注:以上性能对比结果仅供参考,具体性能表现可能因环境和数据规模等因素有所不同)

@作者:加辣椒了吗?
简介:憨批大学生一枚,喜欢在博客上记录自己的学习心得,也希望能够帮助到你们!
在这里插入图片描述

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

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

相关文章

vue3+cesium项目搭建

前言 最近需要在一个Vue3的项目中使用到cesium&#xff0c;对于一个cesium没有太多了解的人来说&#xff0c;还是比较麻烦的&#xff0c;本篇博文就将自己在这个过程踩的坑记录下来&#xff0c;有需要的可以看一下 1、vuecesium框架搭建 2、项目运行起来后&#xff0c;球体不…

展会邀请|虹科诚邀您参加7月11-13日上海慕尼黑光博会

2023年上海慕尼黑光博会与机器视觉展将于7月11-13日在上海国家会展中心隆重召开&#xff01; 慕尼黑上海光博会自2006年举办以来&#xff0c;已成为中国激光、光学、光电行业一年一度的聚会。慕尼黑上海光博会助力行业发展趋势&#xff0c; 集中展示涵盖激光器与光电子、光学与…

科技云报道:当云厂商主动拥抱生成式AI,会碰撞出什么样的火花?

科技云报道原创。 如果说这是AI大模型的时代&#xff0c;不如说是生成式AI的时代。 在AI大模型、生成式AI、ChatGPT这三者中&#xff0c;生成式AI是最广泛的概念&#xff0c;涵盖了所有使用AI生成新内容的应用。 大模型是实现生成式AI的一种方式&#xff0c;而ChatGPT则是大…

精选了20个Python实战项目(附源码),拿走就用!零基础练手不二项目!

Python是目前最好的编程语言之一。由于其可读性和对初学者的友好性&#xff0c;已被广泛使用。 那么要想学会并掌握Python&#xff0c;可以实战的练习项目是必不可少的。 接下来&#xff0c;我将给大家介绍20个非常实用的Python项目&#xff0c;帮助大家更好的学习Python。 …

电表是怎么计算度数的

电表是一种用来测量电能的仪表&#xff0c;也称为电度表、火表、电能表、千瓦小时表等。电表可以通过测量电流、电压、功率等因素来计算用户消耗的电能&#xff0c;从而确定用户应缴纳的电费。在本文中&#xff0c;我们将详细介绍电表的计算方式以及如何读取电表的度数。 一、电…

自学网络安全(黑客)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

Android之WebView加载PDF链接预览PDF文件

文章目录 前言一、效果图二、实现步骤1.在项目main目录下新建一个assets2.新建一个js为index.js3.新建一个HTML为index.html4.xml布局4.Activity类&#xff08;kotlin&#xff09;5.Activity类&#xff08;Java&#xff09; 总结 前言 Android的webview压根就不支持加载pdf&am…

深度卷积网络的实际应用

1、三种经典的深度卷积网络 1.1、LeNet-5 使用 sigmoid 函数和 tanh 函数&#xff0c;而不是ReLu 函数&#xff0c;这篇论文中使用的正是 sigmoid 函数和 tanh 函数LeNet-5 是针对灰度图片训练的&#xff0c;所以图片的大小只有 32321 6 个 55 的过滤器&#xff0c;步幅为 …

【如何在深度学习的道路上越走越远?】

作为近几年人工智能领域的主要研究方向之一&#xff0c;深度学习主要通过构建深度卷积神经网络和采用大量样本数据作为输入&#xff0c;最终得到-一个具有强大分析能力和识别能力的模型。深度学习可以是有监督的、半监督的或无监督的。深度学习架构(例如深度神经网络、深度信念…

el-input输入框type=“number“时,禁止鼠标上下滑动改变数值

el-input输入框type"number"时&#xff0c;禁止鼠标上下滑动改变数值 解决方法&#xff1a;在el-input中添加属性设置 mousewheel.native.prevent

【达哥讲网络——只讲你不知道的】第1集:网络体系结构中的功能模块

大家好&#xff0c;经过公司缜密的思考和策划&#xff0c;【达哥讲网络——只讲你不知道的】系列连载今天正式与大家见面了。经过深入考虑&#xff0c;本系列只对一些重要的网络技术原理、网络功能实现原理及配置进行连载&#xff0c;其中会穿插一些实战案例&#xff0c;以帮助…

python与蒸散发与植被总初级生产力估算

植被总初级生产力(GPP)是指植物通过光合作用吸收的碳&#xff0c;是陆地生物圈和大气之间最大的碳通量&#xff0c;GPP的准确量化对于理解气候变化中生态系统功能、农业生产和碳循环的动态以及对气候的反馈具有重要意义 蒸散发&#xff08;Evapotranspiration&#xff0c;ET&a…

websdk上传阿里云视频完整教程

批量上传视频到阿里云 这段时间项目里有一个上传视频到阿里云的功能是我来负责写的&#xff0c;之前一直没有写过这种功能&#xff0c;感觉很难的亚子&#xff0c;但是后来仔细研究了一遍发现也没想象中那么难&#xff0c;最后经过不懈的努力也算是搞出来了哈哈哈&#xff0c;开…

集合List和Map

ArrayList底层的实现原理 初始化后ArrayList添加元素的步骤 首先计算数组的容量&#xff0c;如果当前数组已使用长度1后的大于当前的数组长度&#xff0c;则调用grow方法扩容(原来的1.5倍)&#xff0c;确保新增的数据有地方存储之后&#xff0c;则添加元素到size的位置上。返回…

docker环境下安装mysql 5.6

一、查看mgsql镜像版本 docker search mysql 二、拉取mysql镜像到本地标签为5.6版本 docker pull mysql:5.6 三、使用mysql5.6镜像创建容器(也叫运行镜像) 1.执行命令&#xff1a; docker run -p 3306:3306 --name mysql -v /haolb/mysql/conf:/etc/mysql/conf.d -v /haolb/my…

P2P、BT、ED2k、FTP、磁力链接下载到底是什么鬼?

1、HTTP/HTTPS 下载 有小伙伴会问&#xff0c;这个协议不是用来浏览网页的时候用的吗&#xff1f; 其实不然&#xff0c;用来下载文件一样可以&#xff0c;本质上都是从服务器拉取资源到本地&#xff0c;不同的是网页内容被渲染到浏览器上&#xff0c;而文件直接放在你的下载…

财富航向:企业为何急需财务管理软件?

随着市场的竞争日益激烈&#xff0c;企业对于财务数据的管理越来越重视。财务管理软件存在的好处越来越明显&#xff0c;它们可以帮助企业更好地管理财务信息并提高工作效率。 企业为什么需要财务管理软件&#xff1f; 1、方便管理财务数据 财务管理软件能够方便地管理与公司财…

教程学习:AutoQSAR

教程和练习文件从软件官网下载 内容&#xff1a; 1、拷贝教程提供的练习文件素材&#xff1a; 在软件的help中选择需要的教程&#xff0c;点击Copy to&#xff0c;可以将教程需要的文件拷贝到指定的文件夹里。点击Browse可以进行预览。 2、建立一个数值型的QSAR模型评估结合…

msvcr120.dll找不到是什么原因,怎样修复

msvcr120.dll的定义 msvcr120.dll是微软Visual C Redistributable软件包中的一个动态链接库文件。它是Microsoft Visual 所需的一个重要组件。这个文件主要用于支持和管理C语言编写的应用程序的运行。它包含了许多C的运行库函数和类&#xff0c;以便应用程序能够正常运行和调用…

2023-07-10:Kafka如何做到消息不丢失?

2023-07-10&#xff1a;Kafka如何做到消息不丢失&#xff1f; 答案2023-07-10&#xff1a; Kafka采用多种机制来确保消息的不丢失&#xff0c;其中包括副本机制、ISR&#xff08;In-Sync Replicas&#xff09;机制以及ACK机制等。 1.副本机制 Kafka通过副本机制来确保消息不…