Java中去除ArrayList重复元素首选LinkedHashSet或Stream.distinct(),前者保持插入顺序且高效,后者简洁函数式;自定义对象需重写equals和hashCode;手动遍历contains效率低不推荐。

Java 中去除 ArrayList 中的重复元素,核心思路是利用集合(如 LinkedHashSet 或 TreeSet)的去重特性,或借助 Java 8 的 Stream API。关键在于:是否需要保持原有顺序、元素是否可排序、是否允许修改原列表。
用 LinkedHashSet 保持插入顺序去重
LinkedHashSet 既能去重,又能保留元素首次出现的顺序,是最常用且推荐的方式。
- 创建一个新的
LinkedHashSet,把原ArrayList全部添加进去(自动去重) - 再将该集合转回
ArrayList - 如果需修改原列表,可调用
list.clear()后list.addAll(newList)
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "a", "c", "b"));
List<String> uniqueList = new ArrayList<>(new LinkedHashSet<>(list));
结果:[a, b, c] —— 顺序不变,重复项仅保留第一个。
用 Stream.distinct()(Java 8+)简洁去重
适合函数式风格,代码简短,同样默认保持顺序(因 distinct() 基于 encounter order)。
立即学习“Java免费学习笔记(深入)”;
- 调用
stream().distinct().collect(Collectors.toList()) - 注意:若元素类型未重写
equals()和hashCode(),自定义对象可能无法正确去重
List<Integer> nums = Arrays.asList(1, 2, 2, 3, 1); List<Integer> unique = nums.stream().distinct().collect(Collectors.toList());
对自定义对象去重需重写 equals + hashCode
如果 ArrayList 存的是自定义类(如 User),仅靠 LinkedHashSet 或 distinct() 不会生效,除非你已正确定义了相等逻辑。
- 必须重写
equals(Object o)和hashCode()方法 - 通常基于业务主键字段(如
id或username)判断是否重复 - IDE(如 IntelliJ)可一键生成这两个方法
不推荐:手动遍历 + contains(效率低)
虽然可行,但时间复杂度为 O(n²),尤其对大列表性能差,仅适合极小数据或教学演示。
- 新建空列表,遍历原列表,每次用
!newList.contains(item)判断再添加 - 避免在循环中直接操作原列表(如
remove()),易引发并发修改异常或漏判


















