Java中如何高效实现复杂类型数据的去重方法?
- 后端开发
- 2025-10-23
- 6
Java中进行去重操作,主要依赖于集合框架中的数据结构,如HashSet、ArrayList等,下面将详细介绍几种常见的方法和步骤,包括使用HashSet、使用LinkedHashSet、使用自定义去重方法以及使用Stream API进行去重。
使用HashSet进行去重
HashSet是基于HashMap实现的,它不允许重复的元素,以下是一个使用HashSet进行去重的例子:

使用LinkedHashSet进行去重
LinkedHashSet是HashSet的子类,它维护了一个双向链表,以保持元素的插入顺序,以下是一个使用LinkedHashSet进行去重的例子:
import java.util.LinkedHashSet; import java.util.Set; public class Main { public static void main(String[] args) { // 创建一个包含重复元素的数组 Integer[] numbers = {1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10}; // 使用LinkedHashSet进行去重,并保持插入顺序 Set<Integer> uniqueNumbers = new LinkedHashSet<>(); for (Integer number : numbers) { uniqueNumbers.add(number); } // 输出去重后的结果 System.out.println(uniqueNumbers); } }
使用自定义去重方法
如果需要根据特定条件进行去重,可以使用自定义方法,以下是一个根据数字的奇偶性进行去重的例子:
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { // 创建一个包含重复元素的数组 Integer[] numbers = {1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10}; // 使用自定义方法进行去重 List<Integer> uniqueNumbers = new ArrayList<>(); for (Integer number : numbers) { if (!uniqueNumbers.contains(number % 2)) { uniqueNumbers.add(number); } } // 输出去重后的结果 System.out.println(uniqueNumbers); } }
使用Stream API进行去重
Java 8引入了Stream API,它提供了一种声明式的方式来处理数据集合,以下是一个使用Stream API进行去重的例子:

import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { // 创建一个包含重复元素的数组 Integer[] numbers = {1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10}; // 使用Stream API进行去重 List<Integer> uniqueNumbers = Arrays.stream(numbers) .distinct() .collect(Collectors.toList()); // 输出去重后的结果 System.out.println(uniqueNumbers); } }
FAQs
Q1:为什么使用HashSet进行去重比使用ArrayList去重效率更高?

A1:HashSet内部使用HashMap实现,它的查找、添加和删除操作的时间复杂度都是O(1),而ArrayList的查找操作时间复杂度是O(n),当需要频繁进行查找和去重操作时,使用HashSet效率更高。
Q2:如何使用Java中的Stream API进行多列去重?
A2:可以使用Collectors.toMap()方法配合键值对来实现多列去重,以下是一个例子:
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { // 创建一个包含重复元素的数组 Person[] people = { new Person("Alice", 25), new Person("Bob", 30), new Person("Alice", 25), new Person("Charlie", 35) }; // 使用Stream API进行多列去重 Map<String, Person> uniquePeople = Arrays.stream(people) .collect(Collectors.toMap( Person::getName, person > person, (existing, replacement) > existing )); // 输出去重后的结果 uniquePeople.forEach((name, person) > System.out.println(name + ": " + person)); } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } }
在这个例子中,我们使用Person类的getName()方法作为键,将整个Person对象作为值,当遇到重复的键时,Collectors.toMap()会保留现有的元素,忽略后面的元素。