hashset可直接用list构造实现自动去重,推荐new hashset(list);java 10+可用set.copyof(list)获得不可变集合,但需注意null支持版本差异及自定义类须重写equals/hashcode。

Java 中 HashSet 可以直接用 List 构造,自动去重,最简洁的方式是传入 List 构造器。
用 ArrayList 构造 HashSet(推荐)
只要 List 元素类型实现了 hashCode() 和 equals()(如 String、Integer 等常用类型),构造时就会自动去重:
-
Set
set = new HashSet(Arrays.asList("a", "b", "a", "c")); → 结果包含 "a", "b", "c" - 底层会遍历 List,逐个调用 add(),重复元素被忽略
- 注意:List 本身不被修改,HashSet 是全新对象
用 Collections.unmodifiableSet 防止误改
如果初始化后不希望集合被修改,可包装为不可变集合:
- Set
safeSet = Collections.unmodifiableSet(new HashSet(list)); - 后续调用 add/remove 会抛 UnsupportedOperationException
- 适合配置类、常量集合等场景
Java 10+ 可用 Set.copyOf(更安全)
Java 10 引入的静态工厂方法,内部自动做不可变封装且校验 null:
- Set
set = Set.copyOf(list); - 若 list 含 null 或有重复,仍会去重;但 list 为 null 会抛 NullPointerException
- 返回的是紧凑、不可变的 Set 实现,内存更优
注意 null 和自定义对象
去重是否生效,取决于元素自身的 equals/hashCode 实现:
- String、Integer 等 JDK 类已正确实现,放心用
- 自定义类必须重写 equals() 和 hashCode(),否则即使内容相同也会视为不同元素
- 如果 List 含 null,HashSet 允许一个 null;Set.copyOf 在 Java 10–13 不支持 null,Java 14+ 支持
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











