Java中List数据去重的3种有效方法总结
作者:_Lemon7
在Java编程中,List集合是一种常用的数据结构,它允许我们存储和操作一组有序的对象,这篇文章主要介绍了Java中List数据去重的3种有效方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
前言
在日常 Java 开发中,List 集合去重是一个非常常见的需求。根据 是否需要保持顺序、数据规模大小、JDK 版本 的不同,去重方式也有所区别。
本文总结了 5 种常见且实用的 List 去重方法,并对每种方法的使用场景、优缺点进行了说明,供大家在实际项目中选择合适的方案。
一、使用 Java 8 Stream 的distinct()方法(推荐)
适用场景:
JDK 8 及以上
追求代码简洁、可读性强
示例代码
public static List<String> delRepeat(List<String> list) {
return list.stream()
.distinct()
.collect(Collectors.toList());
}
原理说明
distinct()底层依赖对象的equals()和hashCode()方法会自动过滤掉重复元素
保留原 List 中的顺序
优缺点
优点:
代码简洁、优雅
可读性强
保留原顺序
缺点:
仅适用于 JDK 8 及以上
二、借助 Set 的特性进行去重(List 与 Set 转换)
适用场景:
不关心元素顺序
对性能有一定要求
示例代码
/**
* 去除重复数据
* 注意:Set 是无序的,不会保持原有顺序
*/
public static List<String> listDistinct(List<String> list) {
List<String> result = new ArrayList<>();
if (list != null && !list.isEmpty()) {
Set<String> set = new HashSet<>(list);
result.addAll(set);
}
return result;
}
原理说明
HashSet天生不允许重复元素通过 Set 进行一次“过滤”
优缺点
优点:
性能较好
实现简单
缺点:
无法保证原 List 的顺序
三、遍历 List,将元素添加到另一个 List 中(保持顺序)
适用场景:
数据量较小
需要严格保持原有顺序
示例代码
public static List<String> delRepeat(List<String> list) {
List<String> listNew = new ArrayList<>();
for (String str : list) {
if (!listNew.contains(str)) {
listNew.add(str);
}
}
return listNew;
}
原理说明
利用
List.contains()判断是否已存在不存在则加入新 List
优缺点
优点:
思路直观
顺序完全一致
缺点:
时间复杂度较高(O(n²))
不适合大数据量
四、利用 Set 去重并保持原有顺序(强烈推荐)
如果既想去重,又想保持顺序,这是非常实用的一种方式。
方法一:使用TreeSet(会排序)
List<String> listNew = new ArrayList<>(new TreeSet<>(list));
注意:
TreeSet会自动排序如果不希望顺序被改变,请慎用
方法二:使用LinkedHashSet(推荐)
List<String> listNew = new ArrayList<>(new LinkedHashSet<>(list));
原理说明
LinkedHashSet内部维护了插入顺序去重的同时保持 List 原有顺序
优缺点
优点:
性能好
顺序稳定
代码简洁
缺点:
需要额外的 Set 容器
实际开发中非常推荐这一种方式
五、使用 List 的remove()方法去重(不推荐 )
适用场景:
几乎不推荐,仅用于理解原理
示例代码
/**
* 去除重复数据(一般不推荐)
* 类似于冒泡排序思想
*/
public static List<Map<String, Object>> distinct(List<Map<String, Object>> list) {
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size() - 1; i++) {
for (int j = list.size() - 1; j > i; j--) {
// 根据实际业务修改比较规则
if (list.get(j).equals(list.get(i))) {
list.remove(j);
}
}
}
}
return list;
}
缺点
- 时间复杂度高(O(n²))
- 直接修改原 List,风险较大
- 可读性和维护性较差
总结对比
| 方法 | 是否推荐 | 是否保持顺序 | 适用场景 |
|---|---|---|---|
| Stream distinct | ⭐⭐⭐⭐⭐ | 是 | JDK 8+,代码简洁 |
| HashSet 转换 | ⭐⭐⭐ | 否 | 不关心顺序 |
| 遍历 List | ⭐⭐ | 是 | 小数据量 |
| LinkedHashSet | ⭐⭐⭐⭐⭐ | 是 | 最常用、最稳妥 |
| remove() 去重 | ⭐ | 是 | 不推荐 |
到此这篇关于Java中List数据去重的3种有效方法的文章就介绍到这了,更多相关Java List数据去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
