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


http://www.mrgr.cn/news/83626.html

相关文章:

  • FPGA的 基本结构(Xilinx 公司Virtex-II 系列FPGA )
  • SpringBoot:使用HTTP2+protobuf实现高性能微服务调用
  • 浅谈云计算01 | 云计算服务的特点
  • C++编程指南13 - 尽量减少可写数据的共享
  • 【Leetcode 每日一题】3298. 统计重新排列后包含另一个字符串的子字符串数目 II
  • MySQL数据导出导入
  • 初识Java3
  • 前端验证码实现
  • Java线程池解密
  • SpringData-Redis缓存之RedisTemplate
  • SpringCloud微服务:基于Nacos组件,整合Dubbo框架
  • 镀锡薄板与镀锡废水详解
  • 中等难度——python实现电子宠物和截图工具
  • 宁德时代C++后端开发面试题及参考答案
  • 51单片机——I2C-EEPROM
  • 【0388】Postgres内核 SQL function 删除 physical replication slot 底层实现( 4 )
  • SparX:一种用于层次视觉Mamba和变换器网络的稀疏跨层连接机制
  • (经过验证)在 Ubuntu 系统中为 VSCode、PyCharm 终端及 Jupyter Notebook 配置代理的完整方案
  • springboot vue uniapp 仿小红书 1:1 还原 (含源码演示)
  • 了解 Ansys Mechanical 中的网格方法:综合指南
  • AI的崛起:它将如何改变IT行业的职业景象?
  • [mysql] 定时任务-全备+差备mysql数据库+邮件通知
  • Python语言的编程范式
  • 什么是JUC?
  • SQL语言的面向对象编程
  • C++基础入门