用Java ArrayList实现数组去重功能的三种方案
更新时间:2026年06月29日 09:33:46 作者:888CC++
这篇文章详细介绍了三种使用Java ArrayList进行数组去重的方法,包括双层循环遍历去重、利用HashSet快速去重以及Java 8 Stream一行代码去重,每种方法都有其适用场景和局限性,需要的朋友可以参考下
方案1:双层循环遍历去重(不依赖其他集合,纯ArrayList)
思路:
- 创建新的 ArrayList 存放结果
- 遍历原集合每一个元素
- 新集合中不存在该元素才添加,自动去重
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数组去重功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring Boot整合Spring Cache及Redis过程解析
这篇文章主要介绍了Spring Boot整合Spring Cache及Redis过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-12-12
Java foreach在lambda的foreach遍历中退出操作(lambda foreach break)
本文详细讲解了在Java的中,特别是在使用forEach()方法时,无法直接使用break或continue关键字来直接控制循环流程的问题,以及提供了三种解决方案,包括使用异常中断、流式编程的limit()和原子布尔标志位,感兴趣的朋友跟随小编一起看看吧2026-05-05
elasticsearch源码分析index action实现方式
这篇文章主要为大家介绍了elasticsearch源码分析index action实现方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-04-04
基于Spring Boot使用JpaRepository删除数据时的注意事项
这篇文章主要介绍了Spring Boot使用JpaRepository删除数据时的注意事项,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06


最新评论