Java中克隆HashSet最常用、最安全的方式是使用构造方法new HashSet(originalSet),创建浅拷贝,简洁高效且互不影响;clone()方法不推荐,因可读性差且存在类型转换风险;需深拷贝时须手动实现。

Java 中克隆复制一个 HashSet 最常用、最安全的方式是使用构造方法传入原集合,即 new HashSet(originalSet)。这种方式创建的是一个**浅拷贝(shallow copy)**,适用于大多数场景。
直接用构造方法创建新 HashSet
这是最推荐的做法,简洁、高效、线程安全(不涉及并发问题时),且能保证新集合与原集合互不影响(修改其中一个不会影响另一个)。
- 底层会遍历原集合所有元素,逐个添加到新 HashSet 中
- 要求元素类型实现
hashCode()和equals()(HashSet 正常工作所必需) - 如果元素是可变对象,注意:元素本身未被复制,只是引用被复制(即“浅拷贝”)
HashSet<String> original = new HashSet<>(Arrays.asList("a", "b", "c"));<br>HashSet<String> copy = new HashSet<>(original);
使用 clone() 方法(不推荐)
HashSet 继承自 AbstractSet,而后者实现了 Cloneable,所以理论上可以调用 clone()。但该方法返回的是 Object,需强制转型,且行为不够直观,还可能因 JDK 版本或子类重写带来不确定性。
立即学习“Java免费学习笔记(深入)”;
- 实际效果和构造方法基本一致(也是浅拷贝)
- 代码可读性差,容易引发
ClassCastException - 官方文档未强调其为标准用法,维护性弱
HashSet<String> copy = (HashSet<String>) original.clone();
需要深拷贝怎么办?
如果 HashSet 中的元素是自定义可变对象,且你希望连对象内容也一并复制(即修改副本中的对象不影响原集合里的对象),就需要手动实现深拷贝。
- 让元素类实现
Cloneable并重写clone(),然后遍历原集合逐个克隆 - 或使用序列化/反序列化(适合可序列化的类)
- 或借助第三方库如 Apache Commons Lang 的
SerializationUtils.clone()
HashSet<Person> deepCopy = original.stream().map(Person::clone).collect(Collectors.toCollection(HashSet::new));
注意不可变集合的情况
如果你用的是 Set.of() 或 Collections.unmodifiableSet() 创建的不可变集合,不能直接修改,但构造新 HashSet 仍可正常复制其内容:
Set<String> unmod = Collections.unmodifiableSet(original);HashSet<String> copy = new HashSet<>(unmod); // ✅ 可行- 但对
unmod调用clone()可能抛出UnsupportedOperationException


















