java中list去重方法
时间: 2025-05-28 17:49:37 浏览: 18
### Java 中对 List 进行去重的方法
在 Java 编程中,`List` 是一种常见的集合类型,用于存储一组有序的对象。然而,由于 `List` 允许存在重复元素,在实际开发过程中可能需要对其进行去重处理。以下是几种常用的去重方法及其示例代码。
#### 方法一:通过循环遍历手动去重
此方法的核心思想是创建一个新的列表来保存唯一值,并逐一检查原列表中的每个元素是否已存在于新列表中。如果不存在,则将其加入新列表。
```java
public static void removeDuplicatesWithLoop() {
List<Integer> list = Arrays.asList(7, 7, 8, 8, 8, 11, 11, 9);
List<Integer> newList = new ArrayList<>(list.size());
for (int i = 0; i < list.size(); i++) {
if (!newList.contains(list.get(i))) {
newList.add(list.get(i));
}
}
System.out.println(newList); // 输出: [7, 8, 11, 9]
}
```
这种方法的时间复杂度较高,适用于小型数据集[^1]。
---
#### 方法二:利用 HashSet 的特性自动去重
`HashSet` 不允许有重复元素,因此可以通过将 `List` 转换为 `HashSet` 来实现去重效果。需要注意的是,转换完成后可以再转回 `ArrayList` 或其他类型的 `List`。
```java
import java.util.*;
public class RemoveDuplicatesUsingHashSet {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(7, 7, 8, 8, 8, 11, 11, 9);
Set<Integer> set = new HashSet<>(list);
List<Integer> uniqueList = new ArrayList<>(set);
System.out.println(uniqueList); // 输出: [7, 8, 9, 11]
}
}
```
该方法效率高,适合大多数场景,但会改变原始顺序[^3]。
---
#### 方法三:基于 LinkedHashSet 维护插入顺序
如果希望保留原有顺序的同时完成去重操作,可以选择使用 `LinkedHashSet` 替代普通的 `HashSet`。
```java
import java.util.*;
public class RemoveDuplicatesPreserveOrder {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(7, 7, 8, 8, 8, 11, 11, 9);
Set<Integer> linkedSet = new LinkedHashSet<>(list);
List<Integer> uniqueList = new ArrayList<>(linkedSet);
System.out.println(uniqueList); // 输出: [7, 8, 11, 9]
}
}
```
这种方式既实现了去重又保持了原有的排列次序[^3]。
---
#### 方法四:借助 Stream API 实现简洁优雅的解决方案
自 Java 8 推出以来,Stream API 成为了处理集合类数据的强大工具之一。下面展示如何运用它来进行高效便捷的去重工作:
```java
import java.util.*;
import java.util.stream.Collectors;
public class RemoveDuplicatesUsingStream {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(7, 7, 8, 8, 8, 11, 11, 9);
List<Integer> uniqueList = list.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(uniqueList); // 输出: [7, 8, 11, 9]
}
}
```
这段代码不仅语义清晰明了而且性能表现良好,特别推荐给熟悉函数式编程风格的朋友尝试采用[^2]。
---
#### 方法五:覆盖 equals 和 hashCode 方法配合特定容器结构
当面对更复杂的业务逻辑或者对象实例时(而非基本数值),我们通常还需要重新定义这些实体类内部的行为准则——即覆写其默认行为下的 `equals()` 及 `hashCode()` 函数体内容之后才能正确判断两者的异同之处进而达到预期目的;最后再放入诸如 `HashSet` 等不允许成员间相互冲突的数据结构之中即可完成整个流程[^4]。
```java
class Item {
private String id;
private int quantity;
@Override
public boolean equals(Object o){
...
}
@Override
public int hashCode(){
...
}
}
// 使用示例省略...
```
以上便是关于 Java 列表如何去掉其中冗余项的一些常见技巧介绍以及对应的实际编码案例分享给大家参考学习之用!
---
阅读全文
相关推荐


















