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

Java List去重:Stream、HashMap与TreeSet对比分析

在处理包含重复元素的List时,高效地去除重复项是提高数据质量的关键步骤。本文将详细介绍如何运用Java 8 Stream API、HashMap以及TreeSet来实现List去重,并比较它们之间的优缺点及适用场景。
在这里插入图片描述

1. 使用Stream API去重

List<String> duplicates = Arrays.asList("apple", "banana", "apple", "cherry", "banana");
List<String> uniqueUsingStream = duplicates.stream().distinct().collect(Collectors.toList());

distinct()是Stream API提供的一个中间操作,它可以有效地移除流中的重复元素。此方法基于Object.equals()实现去重,适用于对象已正确覆盖equals()和hashCode()方法的情况。

2. 使用HashMap去重

List<String> duplicates = ... // 假设是包含重复元素的列表
Set<String> uniqueUsingMap = new HashSet<>(duplicates);
List<String> uniqueListUsingMap = new ArrayList<>(uniqueUsingMap);

通过将List转换为HashSet(底层实现为HashMap),可以利用哈希表特性达到去重效果。这种方法同样依赖于对象的equals()和hashCode()方法,但通常具有较高的性能。

3. 使用TreeSet去重

List<String> duplicates = ... // 同上
List<String> uniqueUsingTreeSet = new ArrayList<>(new TreeSet<>(duplicates));

TreeSet内部使用红黑树进行排序和去重,如果元素类型实现了Comparable接口或者提供了Comparator,那么不仅能去重还能按照指定顺序排列元素。

4. 实例代码详解

1. 使用Stream API去重

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class ListDeDuplicationExample {public static void main(String[] args) {// 创建一个包含重复元素的ListList<String> duplicates = Arrays.asList("apple", "banana", "apple", "cherry", "banana");// 使用Stream API进行去重List<String> uniqueUsingStream = duplicates.stream().distinct().collect(Collectors.toList());// 输出去重后的结果System.out.println("Unique elements using Stream API: " + uniqueUsingStream);// 解析:// `stream()`将List转换为Stream流,`distinct()`是一个中间操作,它会跳过所有连续重复的元素,仅保留第一个出现的。// 最后,`collect(Collectors.toList())`将去重后的流转换回List形式。}
}

2. 使用HashMap去重

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;public class ListDeDuplicationExample {public static void main(String[] args) {// 同样创建一个包含重复元素的ListList<String> duplicates = Arrays.asList("apple", "banana", "apple", "cherry", "banana");// 使用HashMap(通过HashSet间接实现)去重Set<String> uniqueSetUsingMap = new HashSet<>(duplicates);// 将Set转换回ListList<String> uniqueListUsingMap = new ArrayList<>(uniqueSetUsingMap);// 输出去重后的结果System.out.println("Unique elements using HashMap: " + uniqueListUsingMap);// 解析:// HashSet是不允许重复元素存在的集合,其内部使用了HashMap来存储数据,因此当我们将List添加到HashSet时,重复的元素会被自动忽略。// 由于HashSet不保证元素的插入顺序,所以最终转换回List时,元素的顺序可能会变化。}
}

3. 使用TreeSet去重并排序

import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;public class ListDeDuplicationExample {public static void main(String[] args) {// 创建包含重复元素且未排序的ListList<String> duplicates = Arrays.asList("banana", "apple", "cherry", "apple", "banana");// 使用TreeSet去重并按自然顺序排序TreeSet<String> uniqueSortedSet = new TreeSet<>(duplicates);// 将TreeSet转换回ListList<String> uniqueAndSortedList = new ArrayList<>(uniqueSortedSet);// 输出去重并排序后的结果System.out.println("Unique and sorted elements using TreeSet: " + uniqueAndSortedList);// 解析:// TreeSet不仅不允许重复元素,而且它以红黑树的形式存储数据,实现了SortedSet接口,这意味着元素会按照它们的自然顺序或者自定义Comparator进行排序。// 当元素类型String已经实现了Comparable接口时,无需额外提供Comparator也能完成排序。}
}

5. 区别总结

  • Stream.distinct():简洁易用,适合小到中等规模的数据集,且对象需正确实现equals()和hashCode()。适用于数据清洗或简单的集合去重操作,特别是在已经使用Stream API处理其他逻辑的场景下。
  • HashMap/HashSet:基于哈希表,效率较高,尤其在大量数据下表现优秀,同样要求对象具备正确的equals()和hashCode()。当需要快速去重并且不关心元素顺序时,这是一个很好的选择,例如在内存数据库或缓存系统中。
  • TreeSet:不仅去重,还能自动排序,若数据量大且需要排序,则适用性更广,但性能相比前两者可能稍低,因为涉及到了额外的排序操作。当去重的同时需要对元素进行排序时,如生成有序的结果集,或者用于需要保持特定顺序的业务场景。

What is Java technology and why do I need it?
Java is a programming language and computing platform first released by Sun Microsystems in 1995. It has evolved from humble beginnings to power a large share of today’s digital world, by providing the reliable platform upon which many services and applications are built. New, innovative products and digital services designed for the future continue to rely on Java, as well.

While most modern Java applications combine the Java runtime and application together, there are still many applications and even some websites that will not function unless you have a desktop Java installed. Java.com, this website, is intended for consumers who may still require Java for their desktop applications – specifically applications targeting Java 8. Developers as well as users that would like to learn Java programming should visit the dev.java website instead and business users should visit oracle.com/java for more information.

Is Java free to download?
Yes, Java is free to download for personal use.
Java is also free for development: developers can find all the development kits and other useful tools at https://www.oracle.com/javadownload/.

Why should I upgrade to the latest Java patch each quarter when prompted?
The latest Java patches contain important enhancements to improve performance, stability and security of the Java applications that run on your machine. Installing these updates will ensure that your Java applications continue to run with the most up-to-date version.

相关文章:

Java List去重:Stream、HashMap与TreeSet对比分析

在处理包含重复元素的List时&#xff0c;高效地去除重复项是提高数据质量的关键步骤。本文将详细介绍如何运用Java 8 Stream API、HashMap以及TreeSet来实现List去重&#xff0c;并比较它们之间的优缺点及适用场景。 1. 使用Stream API去重 List<String> duplicates …...

大师课程:专业角色AE+AI动画动态设计关键帧学院视频课程 Key Frame Academy – Character Animation Launchpad

使用专业角色动画升级您的动态设计。我将流程的每个阶段分解为易于理解的步骤&#xff0c;以便您可以自信、无缝地创建迫不及待地向客户展示的专业角色动画。 您的创造力就是您的超能力。但说到经验&#xff0c;没有什么比索具过程更能扼杀我的创作火花了……对于许多人来说&am…...

游戏盾SDK如何防护APP攻击

游戏盾SDK如何防护APP攻击&#xff1f;在数字时代的大潮中&#xff0c;APP的安全性是衡量其服务质量与用户信任度的关键指标之一。面对日益复杂多变的网络攻击&#xff0c;如何确保APP在开放的网络环境中稳健运行&#xff0c;成为开发者面临的一大挑战。游戏盾SDK&#xff0c;作…...

Spring Boot 3.x 整合 Logback 日志框架(支持异步写入)

Spring Boot 3.x 整合 Logback 日志框架&#xff08;支持异步写入&#xff09; 在构建任何应用程序时&#xff0c;良好的日志管理都是必不可少的。日志可以帮助我们监控、调试和跟踪代码的运行情况。 1. 添加日志配置文件 在 /resources 资源目录下&#xff0c;创建名为 log…...

从0开始学习搭网站第二天

前言&#xff1a;今天比较惭愧&#xff0c;中午打铲吃了一把&#xff0c;看着也到钻二了&#xff0c;干脆顺手把这个赛季的大师上了&#xff0c;于是乎一直到网上才开始工作&#xff0c;同样&#xff0c;今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…...

【Unity-Animator】通过 StateMachineBehaviour 实现回调

StateMachineBehaviour 简介 StateMachineBehaviour是一个基类&#xff0c;所有状态脚本都派生自该类。它可以在状态机进入、退出或更新状态时执行代码&#xff0c;而无需编写自己的逻辑来测试和检测状态的变化。这使得开发者可以更方便地处理状态转换时的逻辑&#xff0c;例…...

鸿蒙中自定义slider实现字体大小变化

ui&#xff1a; import { display, mediaquery, router } from kit.ArkUI import CommonConstants from ./CommonConstants; import PreferencesUtil from ./PreferencesUtil; import StyleConstants from ./StyleConstants;// 字体大小 Entry Component struct FontSize {Sta…...

数据结构与算法之栈: LeetCode 71. 简化路径 (Ts版)

简化路径 https://leetcode.cn/problems/simplify-path/description/ 描述 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 ‘/’ 开头&#xff09;&#xff0c;请你将其转化为 更加简洁的规范路径 在 Unix 风格的文件系统中…...

STM32-笔记40-BKP(备份寄存器)

一、什么是BKP&#xff08;备份寄存器&#xff09;&#xff1f; 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域里&#xff0c;当VDD电源被切断&#xff0c;他们仍然由VBAT维持供电。当系统在待机模式下被唤醒&#xff0c;或…...

NAS中不同RAID级别特点与适用场景

1. RAID 0&#xff08;条带化&#xff09; 硬盘数量&#xff1a;至少2块。硬盘要求&#xff1a;硬盘容量可以不同&#xff0c;但总容量以最小硬盘为准&#xff08;例如&#xff1a;1TB 2TB 2TB&#xff0c;其中1TB会被浪费&#xff09;。优点&#xff1a; 读写性能显著提升&…...

node.js的进程保活

nodejs的进程保活其实用PM2应该更好用些&#xff0c;不过由于原理其实并不复杂&#xff0c;我们可以自己手写一个服务来干这个工作。 假设我们有一个服务&#xff0c;可以这样来定义下它的相关信息&#xff1a; const svcs[ {"sid":"apl","name"…...

meta name=“viewport“ content=“width=device-width, initial-scale=1.0“

meta name“viewport” content“widthdevice-width, initial-scale1.0” 这段代码在网页设计中扮演着非常重要的角色&#xff0c;尤其是在响应式设计中。下面是对这段代码的详细解释及其在响应式设计中的作用&#xff1a; 1. 代码含义 html Copy Code meta 标签是 HTML 中用…...

【vue3】 defineExpose 的使用

以下是 Vue3 中defineExpose的使用方法&#xff1a; 基本概念 defineExpose是 Vue3 中的一个工具函数&#xff0c;是仅能在<script setup>中使用的函数&#xff0c;用于显式暴露组件内部的属性或方法给父组件使用2。在 Vue3 的<script setup>中&#xff0c;组件的…...

思维转换:突破思维桎梏,创造更高效的工作与生活

在现代职场和生活中&#xff0c;我们经常面临着各种挑战和问题&#xff0c;有时候虽然付出了很多努力&#xff0c;但依然难以找到更有效的解决方案。这时&#xff0c;或许我们需要的不是更多的努力&#xff0c;而是一次“思维转换”。这一概念看似简单&#xff0c;但它背后却蕴…...

OpenCV相机标定与3D重建(55)通用解决 PnP 问题函数solvePnPGeneric()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 根据3D-2D点对应关系找到物体的姿态。 cv::solvePnPGeneric 是 OpenCV 中一个更为通用的函数&#xff0c;用于解决 PnP 问题。它能够返回多个可能…...

vue3学习日记5 - 项目起步

最近发现职场前端用的框架大多为vue&#xff0c;所以最近也跟着黑马程序员vue3的课程进行学习&#xff0c;以下是我的学习记录 视频网址&#xff1a; Day2-11.项目起步-静态资源引入和ErrorLen安装_哔哩哔哩_bilibili 学习日记&#xff1a; vue3学习日记1 - 环境搭建-CSDN博…...

java导出pdf文件

java导出pdf&#xff0c;前端下载 1、制作pdf模板2、获取pdf导出中文需要的文件3、实现4、前端发起请求并生成下载链接 使用注意点 因为原来制作的pdf表单内容过于复杂&#xff0c;下面代码只包含前两行的操作。 本次操作需要前端向后端发起请求&#xff0c;后端返回数据给前端…...

【MySQL学习笔记】MySQL视图View

视图View 1、视图的基础语法2、检查选项3、视图的更新4、视图的作用 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&…...

从玩具到工业控制--51单片机的跨界传奇【2】

咱们在上一篇博客里面讲解了什么是单片机《单片机入门》&#xff0c;让大家对单片机有了初步的了解。我们今天继续讲解一些有关单片机的知识&#xff0c;顺便也讲解一下我们单片机用到的C语言知识。如果你对C语言还不太了解的话&#xff0c;可以看看博主的C语言专栏哟&#xff…...

【Redis】初识Redis

目录 Redis简介 Redis在内存中存储数据 Redis数据库中的应用 Redis缓存中的应用 Redis消息中间件 尾言 Redis简介 如下是Redis官网中&#xff0c;对Redis的一段描述 在这段描述中&#xff0c;我们提取如下关键要点&#xff1a; Redis主要用于在内存中存储数据Redis可…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...