linkedhashset 是最简洁、高效且能保持顺序的去重方案,其内部基于哈希表+双向链表,支持去重并保留首次插入顺序,一行代码即可完成转换。

用 LinkedHashSet 是最简洁、高效且能保持顺序的方案。
用 LinkedHashSet 去重(推荐)
LinkedHashSet 内部基于哈希表 + 双向链表,既能去重,又能保留元素首次插入的顺序。转换过程只需一行代码(配合构造方法):
- 创建新的
LinkedHashSet,传入原ArrayList; - 再用该集合构造新的
ArrayList。
示例:
ArrayList<string> list = new ArrayList(Arrays.asList("a", "b", "a", "c", "b"));
ArrayList<string> uniqueList = new ArrayList(new LinkedHashSet(list));
// 结果:["a", "b", "c"],顺序不变</string></string>
手动遍历 + contains 判断(适合小数据或需自定义逻辑)
如果元素类型没有正确重写 equals 和 hashCode,或你想控制去重条件(比如忽略大小写),可用循环加判断的方式:
- 新建空
ArrayList存结果; - 遍历原列表,对每个元素检查是否已在结果列表中存在(
!result.contains(item)); - 不存在则添加。
注意:contains 对大列表性能较差(O(n) 每次),整体为 O(n²),仅建议用于几百项以内。
使用 Java 8 Stream(简洁但稍重)
借助 Stream.distinct(),它内部也依赖元素的 equals 和 hashCode,并保持遇到顺序:
ArrayList<string> uniqueList = list.stream()
.distinct()
.collect(Collectors.toCollection(ArrayList::new));</string>
优点是函数式风格清晰;缺点是创建了中间流对象,内存和性能略逊于 LinkedHashSet 方案,但可读性好。
自定义对象去重要注意什么?
若 ArrayList 存的是自定义类(如 User),必须重写 equals() 和 hashCode(),否则 LinkedHashSet 或 distinct() 都会把不同实例视为不重复(默认按引用比较)。
- 比如按
id字段去重,就应在equals和hashCode中只基于id实现; - IDE(如 IntelliJ)可一键生成这两个方法,确保逻辑一致。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











