Java中List数据去重的3种有效方法总结

 更新时间:2026年02月26日 10:10:59   作者:_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数据去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JAVA JNA调用C接口的三种实现方式

    JAVA JNA调用C接口的三种实现方式

    文章主要介绍了使用JNA(Java Native Access)调用C库的方法,包括继承Library接口、直接使用`NativeLibrary`实例和使用头文件实现接口等方式,并详细描述了在Linux环境下使用JNA调用C库的具体操作步骤,还涉及到了一些遇到的问题的解决方法
    2026-05-05
  • Java实现读取Jar文件属性的方法详解

    Java实现读取Jar文件属性的方法详解

    这篇文章主要为大家详细介绍了如何利用Java语言实现读取Jar文件属性的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-08-08
  • SpringBoot中@Conditional注解的介绍及实践

    SpringBoot中@Conditional注解的介绍及实践

    在 Spring Boot 中,@Conditional 注解用于实现 条件化 Bean 装配,本文将详细介绍 @Conditional 相关的注解,并结合实际应用示例讲解其使用方式,感兴趣的小伙伴可以了解下
    2025-03-03
  • 带你入门Java的方法

    带你入门Java的方法

    这篇文章主要介绍了java基础之方法详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-07-07
  • Springboot如何统一处理Filter异常

    Springboot如何统一处理Filter异常

    这篇文章主要介绍了Springboot如何统一处理Filter异常问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java中JDBC的使用教程详解

    Java中JDBC的使用教程详解

    Java语言操作数据库 JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。本文讲解了JDBC的使用方法,需要的可以参考一下
    2022-06-06
  • Flink JobGraph生成源码解析

    Flink JobGraph生成源码解析

    这篇文章主要为大家介绍了Flink JobGraph生成源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Java输入输出语句举例详解(通俗易懂!)

    Java输入输出语句举例详解(通俗易懂!)

    这篇文章主要给大家介绍了关于Java输入输出语句的相关资料,作为一种常用的编程语言,Java提供了多种输入输出的方式,用于与用户进行数据交互或处理文件数据,需要的朋友可以参考下
    2023-10-10
  • java 中Thread.join()的使用方法

    java 中Thread.join()的使用方法

    这篇文章主要介绍了java 中Thread.join()的使用方法的相关资料,需要的朋友可以参考下
    2017-04-04
  • SpringBoot项目中使用腾讯云发送短信的实现

    SpringBoot项目中使用腾讯云发送短信的实现

    本文主要介绍了SpringBoot项目中使用腾讯云发送短信的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论