用Java ArrayList实现数组去重功能的三种方案

 更新时间:2026年06月29日 09:33:46   作者:888CC++  
这篇文章详细介绍了三种使用Java ArrayList进行数组去重的方法,包括双层循环遍历去重、利用HashSet快速去重以及Java 8 Stream一行代码去重,每种方法都有其适用场景和局限性,需要的朋友可以参考下

方案1:双层循环遍历去重(不依赖其他集合,纯ArrayList)

思路:

  1. 创建新的 ArrayList 存放结果
  2. 遍历原集合每一个元素
  3. 新集合中不存在该元素才添加,自动去重
import java.util.ArrayList;

public class ArrayListDistinct1 {
    public static void main(String[] args) {
        // 原数组,包含重复数据
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(2);
        list.add(3);
        list.add(1);
        list.add(4);
        list.add(3);

        System.out.println("去重前:" + list);
        ArrayList<Integer> newList = distinctByLoop(list);
        System.out.println("去重后:" + newList);
    }

    /**
     * 双层循环去重,保留原有顺序
     */
    public static <E> ArrayList<E> distinctByLoop(ArrayList<E> oldList) {
        ArrayList<E> result = new ArrayList<>();
        for (E item : oldList) {
            // 新集合没有当前元素才添加
            if (!result.contains(item)) {
                result.add(item);
            }
        }
        return result;
    }
}

输出:

去重前:[1, 2, 2, 3, 1, 4, 3]
去重后:[1, 2, 3, 4]

优点:仅使用 ArrayList,不引入其他类;保留插入顺序
缺点:contains() 底层遍历,数据量大性能差 O(n²)

方案2:借助 HashSet 快速去重(性能更高,推荐)

思路:Set 天然不允许重复元素,中转去重后转回 ArrayList

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class ArrayListDistinct2 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("苹果");
        list.add("香蕉");
        list.add("苹果");
        list.add("橙子");
        list.add("香蕉");

        System.out.println("去重前:" + list);
        ArrayList<String> distinctList = distinctBySet(list);
        System.out.println("去重后:" + distinctList);
    }

    public static <E> ArrayList<E> distinctBySet(ArrayList<E> oldList) {
        // Set自动去重
        Set<E> set = new HashSet<>(oldList);
        // 转回ArrayList
        return new ArrayList<>(set);
    }
}

注意:HashSet 会打乱原有元素顺序。

如果需要【去重+保留顺序】用 LinkedHashSet

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Set;

public class DistinctOrder {
    public static <E> ArrayList<E> distinctKeepOrder(ArrayList<E> oldList) {
        Set<E> set = new LinkedHashSet<>(oldList);
        return new ArrayList<>(set);
    }

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(5);
        list.add(3);
        list.add(5);
        list.add(1);
        ArrayList<Integer> res = distinctKeepOrder(list);
        System.out.println(res); // [5, 3, 1] 顺序不变
    }
}

方案3:Java8 Stream一行代码去重(最简写法)

import java.util.ArrayList;
import java.util.List;

public class StreamDistinct {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(2);
        list.add(2);
        list.add(7);
        list.add(7);
        list.add(9);

        // distinct() 去重,collect转回ArrayList
        List<Integer> distinctList = list.stream()
                .distinct()
                .toList();

        System.out.println(distinctList);
    }
}

总结对比

方式优点缺点
双层循环contains只使用ArrayList、有序大数据效率低
LinkedHashSet效率高、有序需要导入Set集合
Stream distinct代码极简JDK8+支持

到此这篇关于用Java ArrayList实现数组去重功能的三种方案的文章就介绍到这了,更多相关Java ArrayList数组去重功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现统一异常处理的示例

    java实现统一异常处理的示例

    一个全局异常处理类需要处理三类异常1.业务类异常,2.运行时异常 ,3.Error,本文给大家介绍java实现统一异常处理的示例,感兴趣的朋友一起看看吧
    2021-06-06
  • Spring Boot整合Spring Cache及Redis过程解析

    Spring Boot整合Spring Cache及Redis过程解析

    这篇文章主要介绍了Spring Boot整合Spring Cache及Redis过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java 基于AQS实现自定义同步器的示例

    Java 基于AQS实现自定义同步器的示例

    这篇文章主要介绍了Java 基于AQS实现自定义同步器的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • Java foreach在lambda的foreach遍历中退出操作(lambda foreach break)

    Java foreach在lambda的foreach遍历中退出操作(lambda foreach break)

    本文详细讲解了在Java的中,特别是在使用forEach()方法时,无法直接使用break或continue关键字来直接控制循环流程的问题,以及提供了三种解决方案,包括使用异常中断、流式编程的limit()和原子布尔标志位,感兴趣的朋友跟随小编一起看看吧
    2026-05-05
  • Java中Semaphore(信号量)的使用方法

    Java中Semaphore(信号量)的使用方法

    这篇文章主要介绍了Java中Semaphore(信号量)的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • MapStruct表达式应用及避坑详解

    MapStruct表达式应用及避坑详解

    一不小心踩了MapStruct表达式的坑,发现了一个在官方文档上都找不到的功能,有必要记录下。MapStruct是一个代码生成器,它基于约定优于配置的方法大大简化了Java Bean类型之间的映射的实现
    2022-02-02
  • Spring之IOC底层原理详解

    Spring之IOC底层原理详解

    这篇文章主要介绍了Spring之IOC底层原理,内容详细,文章简单易懂,具有一定的参考价值,需要的朋友可以参考下
    2023-01-01
  • elasticsearch源码分析index action实现方式

    elasticsearch源码分析index action实现方式

    这篇文章主要为大家介绍了elasticsearch源码分析index action实现方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • Java 中的 this 和 super 区别

    Java 中的 this 和 super 区别

    这篇文章主要介绍了Javathis与super本质区别,this与super是类实例化时通往Object类通道的打通者;this和super在程序中由于其经常被隐式的使用而被我们忽略,但是理解其作用和使用规范肯定是必须的。接下来将详述this与super的作用和区别,需要的朋友可以参考一下
    2021-11-11
  • 基于Spring Boot使用JpaRepository删除数据时的注意事项

    基于Spring Boot使用JpaRepository删除数据时的注意事项

    这篇文章主要介绍了Spring Boot使用JpaRepository删除数据时的注意事项,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论