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中的IO读写原理详解

    Java中的IO读写原理详解

    这篇文章主要介绍了Java中的IO读写原理,IO是指输入和输出操作的技术,它提供了一组用于读取和写入数据的类,以及用于处理字符和字节数据的接口,这些类和接口可以用于读取和写入文件、网络流、内存缓冲区等各种数据源和目标,需要的朋友可以参考下
    2023-08-08
  • SpringBoot加载读取配置文件过程详细分析

    SpringBoot加载读取配置文件过程详细分析

    在实际的项目开发过程中,我们经常需要将某些变量从代码里面抽离出来,放在配置文件里面,以便更加统一、灵活的管理服务配置信息。所以本文将为大家总结一下SpringBoot加载配置文件的常用方式,需要的可以参考一下
    2023-01-01
  • 由ArrayList来深入理解Java中的fail-fast机制

    由ArrayList来深入理解Java中的fail-fast机制

    fail-fast俗称快速失败,是在多线程进行迭代操作时产生冲突的一种异常抛出机制,下面我们就由ArrayList来深入理解Java中的fail-fast机制.
    2016-05-05
  • 一篇文章看懂Java异常处理

    一篇文章看懂Java异常处理

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的,这篇文章主要给大家介绍了关于Java异常处理的相关资料,需要的朋友可以参考下
    2021-11-11
  • Java泛型的使用限制实例分析

    Java泛型的使用限制实例分析

    这篇文章主要介绍了Java泛型的使用限制,结合实例形式分析了不能使用java泛型的情况以及泛型使用的相关注意事项,需要的朋友可以参考下
    2019-08-08
  • 浅谈SpringBoot内嵌Tomcat的实现原理解析

    浅谈SpringBoot内嵌Tomcat的实现原理解析

    这篇文章主要介绍了浅谈SpringBoot内嵌Tomcat的实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • gradle安装和环境配置全过程

    gradle安装和环境配置全过程

    本文介绍了如何安装和配置Gradle环境,包括下载Gradle、配置环境变量、测试Gradle以及在IntelliJ IDEA中配置Gradle
    2025-01-01
  • SpringCloud之Admin服务监控实现流程示例详解

    SpringCloud之Admin服务监控实现流程示例详解

    这篇文章主要为大家介绍了SpringCloud之Admin服务监控流程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • SpringCloud Edgware.SR3版本中Ribbon的timeout设置方法

    SpringCloud Edgware.SR3版本中Ribbon的timeout设置方法

    今天小编就为大家分享一篇关于SpringCloud Edgware.SR3版本中Ribbon的timeout设置方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Spring Boot 集成 InfluxDB 3.x完整教程

    Spring Boot 集成 InfluxDB 3.x完整教程

    本文详细介绍了如何在SpringBoot项目中集成InfluxDB3.x,并提供了一个完整的教程,包括环境准备、添加依赖、配置连接信息、创建客户端配置类、数据写入与查询示例以及关键注意事项,感兴趣的朋友跟随小编一起看看吧
    2026-01-01

最新评论