JAVA Set集合的深拷贝

发布时间 2023-11-13 11:22:44作者: 小log

之前在做统计的时候,用到Set集合,存储到Map中,但是因为是浅拷贝,导致数据错误问题。这里记录下如何深度拷贝Set

关于浅拷贝和深拷贝的的问题,请参考另一篇文章《JAVA 的深拷贝和浅拷贝》

简而言之:深拷贝是完全创建一个新的对象,是一个全新的对象。而浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。

Set集合的深拷贝有以下三种方式:

方法一:使用构造函数
Java中的Set接口没有提供直接复制Set的方法。但是,我们可以使用Set的构造函数来复制一个Set。

Set<String> originalSet = new HashSet<>();
originalSet.add("apple");
originalSet.add("banana");
originalSet.add("orange");

Set<String> copiedSet = new HashSet<>(originalSet);

方法二:使用clone()方法
Set接口继承自Collection接口,而Collection接口继承自Cloneable接口。因此,Set接口实现类可以使用clone()方法来复制Set对象。以下是使用clone()方法复制Set的示例代码:

Set<String> originalSet = new HashSet<>();
originalSet.add("apple");
originalSet.add("banana");
originalSet.add("orange");

Set<String> copiedSet = (Set<String>) originalSet.clone();

测试:

 HashMap<String,Object> testMap = new HashMap<>();
Set<String> list = new HashSet<>();
// 直接复制到list2
Set<String> list2 = list;
list.add("aaa");
testMap.put("原Set", list);
// 通过方法一复制
testMap.put("方法一", new HashSet<>(list));
list.add("cccc");
// 通过方法二复制
testMap.put("方法二", ((HashSet<String>) list).clone());
list.add("dddd");

System.out.println(testMap.get("原Set"));
System.out.println(testMap.get("方法一"));
System.out.println(testMap.get("方法二"));
System.out.println(list2);

System.out.println( System.identityHashCode(testMap.get("原Set")));
System.out.println( System.identityHashCode(testMap.get("方法一")));
System.out.println( System.identityHashCode(testMap.get("方法二")));
System.out.println( System.identityHashCode(list2));

结果如图所示:

可以看到方法一、方法二,与原Set地址不一样,是一个新的对象。直接复制和原Set地址一样,是一个引用。