最简洁高效的方式是直接用HashSet构造方法传入ArrayList。HashSet提供接收Collection参数的构造方法,ArrayList实现Collection接口,可自动去重;需确保元素正确实现equals和hashCode,自定义类须重写这两个方法;如需保持插入顺序,可用LinkedHashSet。

直接用 HashSet 的构造方法传入 ArrayList 即可,这是最简洁、高效的方式。
使用构造函数一次性转换
Java 集合框架中,HashSet 提供了接收 Collection 类型参数的构造方法。由于 ArrayList 实现了 Collection 接口,所以可以直接传入:
- 代码示例:
ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "b", "a", "c"));HashSet<String> set = new HashSet<>(list); // 自动去重
此时 set 包含 {"a", "b", "c"}(顺序不保证),重复元素 "a" 已被自动忽略。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
注意元素必须正确实现 equals 和 hashCode
去重是否生效,取决于元素类型的 equals() 和 hashCode() 方法:
立即学习“Java免费学习笔记(深入)”;
- 对于
String、基本类型包装类(如Integer)、LocalDate等 JDK 内置类型,已正确实现,可直接用; - 如果是自定义对象(如
User类),必须重写equals和hashCode,否则即使内容相同也会被视为不同对象,无法去重。
如果需要保留插入顺序,考虑 LinkedHashSet
HashSet 不保证顺序,若想保持原 ArrayList 中首次出现的顺序,可用 LinkedHashSet:
Set<String> set = new LinkedHashSet<>(list);
它同样去重,但迭代时按首次添加的顺序返回元素。
不推荐手动遍历 add(除非有额外逻辑)
虽然可以写循环逐个 add,但没必要:
- 构造函数内部就是遍历 + add,效果完全一样;
- 手动写反而冗余,还容易出错(比如忘记判空或异常处理)。

















