首页 > 编程语言 >JAVA Set集合的深拷贝

JAVA Set集合的深拷贝

时间:2023-11-13 11:23:51浏览次数:35  
标签:Set JAVA testMap System add 拷贝 originalSet

之前在做统计的时候,用到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地址一样,是一个引用。

 

标签:Set,JAVA,testMap,System,add,拷贝,originalSet
From: https://www.cnblogs.com/hungryquiter/p/17828743.html

相关文章

  • TreeSet
    TreeSet的基本操作放到TreeSet集合中的元素:无序不可重复,但是可以按照元素的大小顺序自动排序(默认升序)//集合的创建TreeSet<Integer>treeSet=newTreeSet<>();//添加元素treeSet.add(1);treeSet.add(10);treeSet.add(199);treeSet.add(41);treeSet.add(0);//遍......
  • macOS系统安装Java环境 Jdk1.8安装 新手详细教程(全网最详细)
    1.jdk安装包下载https://www.oracle.com/cn/java/technologies/downloads/#java8-mac 点击同意条款,并下载. 注册/登录Oracle. 2.下载完成之后双击安装包进行安装. 输入开机密码,安装软件. 3.配置JDK环境变量.(1)打开终端: 打开访达,选择应用程序中的实......
  • husky——The '.husky/pre-commit' hook was ignored because it's not set as execut
    前言系统:machint:The'.husky/pre-commit'hookwasignoredbecauseit'snotsetasexecutable.hint:Youcandisablethiswarningwith`gitconfigadvice.ignoredHookfalse`.hint:The'.husky/prepare-commit-msg'hookwasignoredbec......
  • Java语言基础知识全总结
    一.Java的优点1.      跨平台性。一次编译,到处运行。Java编译器会将Java代码编译成能在JVM上直接运行的字节码文件,C++会将源代码编译成可执行的二进制代码文件,所以C++执行速度快2.      纯面向对象。Java所有的代码都必须在类中书写。C++兼具面向对象和面向过程的特......
  • 享元模式--Java实现
    相关类图具体代码//ChessFactory.javapackageorg.example.test012;importjava.util.Hashtable;publicclassChessFactory{publicstaticChessFactorygetChessFactory(){returnchessFactory;}publicstaticChessFactorychessFactory=......
  • java.net.ConnectException: Connection refused: no further information
    问题描述报错原因在测试过程中,没有开启Redis解决方案开启Redis,再重新运行代码即可解决......
  • java常用正则表达式工具
    publicclassRegexUtils{/***是否是无效手机格式*@paramphone要校验的手机号*@returntrue:符合,false:不符合*/publicstaticbooleanisPhoneInvalid(Stringphone){returnmismatch(phone,RegexPatterns.PHONE_REGEX);......
  • Intellij Idea创建Java Web项目
    创建非Maven的JavaWeb项目创建项目依次点击File->New->Project指定web服务器指定项目的名称及项目文件的保存地址创建成功创建class文件和lib文件夹点击项目的WEB-INF文件夹,右键,New→Directory创建两个文件夹,classes(用来存放编译后输出的class文件)和lib(用于......
  • java-常用类
    第十章java常用类包装类引入【1】什么是包装类:以前定义变量,经常使用基本数据类型,对于基本数据类型来说,它就是一个数,加点属性,加点方法,加点构造器,将基本数据类型对应进行了一个封装,产生了一个新的类,---》包装类。int,byte.....--->基本数据类型包装类--->引用数据类型 ......
  • java-异常处理
    第九章java异常处理习题的引入【1】代码: 1publicclassTest{2//这是一个main方法,是程序的入口:3publicstaticvoidmain(String[]args){4//实现一个功能:键盘录入两个数,求商:5Scannersc=newScanner(System.in);6Sy......