LinkedHashSet 是最简单有效的方法,它既能去重又能保留插入顺序;底层基于 LinkedHashMap,天然保证插入顺序且不允许重复,转为 ArrayList 后时间复杂度 O(n),支持 null,要求元素正确实现 equals() 和 hashCode()。

用 LinkedHashSet 是最简单有效的方法,它既能去重又能保留插入顺序。
使用 LinkedHashSet 去重(推荐)
LinkedHashSet 底层基于 LinkedHashMap,天然保证元素插入顺序,且不允许重复。把 List 转成 LinkedHashSet 再转回 ArrayList 即可:
- 适用于大多数场景,代码简洁、性能好(时间复杂度 O(n))
- 要求元素正确实现 equals() 和 hashCode()
- 原始 List 中的 null 元素也能正常处理(LinkedHashSet 允许一个 null)
示例代码:
List<string> list = Arrays.asList("a", "b", "a", "c", "b");
List<string> uniqueList = new ArrayList(new LinkedHashSet(list));</string></string>
使用 Java 8 Stream 的 distinct() 方法
Stream API 提供了 distinct() 操作,内部基于 HashSet 去重,同时按流中元素出现顺序保留第一个:
- 函数式风格,适合链式操作(比如后续还要 filter/map)
- 同样依赖元素的 equals/hashCode
- 注意:必须用 collect(Collectors.toList()) 收集结果,否则得不到 List
示例代码:
List<string> uniqueList = list.stream()
.distinct()
.collect(Collectors.toList());</string>
手动遍历 + Set 判断(兼容老版本或需控制逻辑时)
如果需要自定义去重逻辑(比如只对某字段去重),或者目标环境不支持 Stream,可用传统方式:
- 新建一个空 ArrayList 和一个 HashSet
- 遍历原 List,对每个元素先检查是否已存在 Set 中,未存在则加入 Set 和新 List
- 这样既避免修改原集合,又完全掌控过程
示例代码:
List<string> uniqueList = new ArrayList();
Set<string> seen = new HashSet();
for (String item : list) {
if (seen.add(item)) { // add() 返回 true 表示之前不存在
uniqueList.add(item);
}
}
</string></string>
注意事项
所有方法都依赖对象的 equals() 和 hashCode() 实现是否合理。对于自定义对象,务必重写这两个方法;否则默认比较的是引用地址,会导致去重失效。
如果 List 元素是基本类型包装类(如 Integer、String)或常用 JDK 类型,通常已内置正确实现,可直接使用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











