Java中ArrayList去重有三种常用方法:用LinkedHashSet(推荐,保持插入顺序)、Stream.distinct()(函数式风格,需Java 8+)、手动遍历+contains判断(适合小数据量或自定义逻辑)。

Java 中 ArrayList 去重,核心在于“保留唯一元素、不改变原始顺序(可选)”,常用方法有三种:用 LinkedHashSet、用 Stream.distinct()(Java 8+)、或手动遍历 + 判断。下面按实际需求分情况说明。
用 LinkedHashSet 快速去重(推荐,保持插入顺序)
LinkedHashSet 既去重,又保留元素添加的顺序,适合大多数场景。它底层基于哈希表 + 双向链表,时间复杂度接近 O(n)。
操作步骤:
- 将原 ArrayList 构造为 LinkedHashSet(自动去重)
- 再转回 ArrayList 即可
示例代码:
立即学习“Java免费学习笔记(深入)”;
ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "b", "a", "c", "b"));
list = new ArrayList<>(new LinkedHashSet<>(list));
// 结果:["a", "b", "c"],顺序不变,重复项被移除
用 Stream.distinct()(函数式风格,简洁易读)
适用于 Java 8 及以上版本,适合链式调用或配合其他流操作(如 filter、map)使用。distinct() 依赖元素的 equals() 和 hashCode() 方法判断是否重复。
注意:返回的是新 List,原 list 不变;若需修改原 list,需重新赋值。
示例代码:
立即学习“Java免费学习笔记(深入)”;
ArrayList<String> list = new ArrayList<>(Arrays.asList("x", "y", "x", "z"));
list = list.stream().distinct().collect(Collectors.toCollection(ArrayList::new));
// 结果:["x", "y", "z"]
手动遍历 + contains 判断(适合自定义逻辑或小数据量)
当需要在去重过程中加入条件(例如只保留第一次出现且满足某规则的元素),或无法使用 Set/Stream 时,可用此方式。但性能较差(O(n²)),仅建议用于小列表(如百条以内)。
要点:
- 新建空 ArrayList 存结果
- 遍历原 list,对每个元素检查是否已在结果 list 中
- 未存在则 add 进去
示例代码:
立即学习“Java免费学习笔记(深入)”;
ArrayList<String> original = ...;
ArrayList<String> unique = new ArrayList<>();
for (String item : original) {
if (!unique.contains(item)) {
unique.add(item);
}
}
注意事项
所有方法都依赖对象的 equals() 和 hashCode() 正确实现。如果 ArrayList 存的是自定义对象(如 Person),必须重写这两个方法,否则去重会失效(默认比较引用)。
例如 Person 类中没重写 equals,即使 name 和 age 相同,也被视为不同对象。
另外:若要求“去重但保留最后一次出现的元素”,不能直接用 LinkedHashSet 或 distinct(),需反向遍历或用 Map 记录最后索引再重组。


















