Java的深拷贝的例子
在一些情况下 如果不进行深拷贝而是直接将一个值赋值给另一个变量 如果我们期望这两个变量相互不影响 那么实际情况可能往往出乎我们的意料
public class TestEasy {public static void main(String[] args) {//1.基本类型不需要深度拷贝Map<String, String> map11 = new HashMap<>();map11.put("test", "1111");Map<String, String> map22 = new HashMap<>();map22.putAll(map11);map22.put("test", "1234");System.out.println(map11);System.out.println(map22);System.out.println("");//2.非基本类型需要深度拷贝 比如Set<String>//不深度拷贝Map<String, Set<String>> map = new HashMap<String, Set<String>>();Set<String> set = new HashSet<>();set.add("aaaa");map.put("1", set);Map<String, Set<String>> map2 = new HashMap<>();map2.putAll(map);Set<String> set2;set2 = map2.get("1");set2.add("bbb");//map和map2实际还是指向同一个map 输出一样的内容System.out.println(map2.values());System.out.println(map.values());System.out.println("");//深度拷贝Map<String, Set<String>> mapDeep = new HashMap<String, Set<String>>();Set<String> setDeep = new HashSet<>();setDeep.add("aaaa");mapDeep.put("1", setDeep);Map<String, Set<String>> map2Deep = new HashMap<>();map2Deep = deepCopy(mapDeep);Set<String> set2Deep;set2Deep = map2Deep.get("1");set2Deep.add("bbb");//进行深拷贝后 内容不同了System.out.println(mapDeep.values());System.out.println(map2Deep.values());System.out.println("");//3.非基本类型需要深度拷贝 比如User//不深度拷贝Map<String, User> uMap = new HashMap<>();User user = new User("zhangsan", 12);uMap.put("1", user);Map<String, User> uMap2 = new HashMap<>();uMap2.putAll(uMap);User tempUser = uMap2.get("1");tempUser.setName("abc");System.out.println(uMap);System.out.println(uMap2);System.out.println("");//深度拷贝Map<String, User> uMapDeep = new HashMap<>();User userDeep = new User("zhangsan", 12);uMapDeep.put("1", userDeep);Map<String, User> uMap2Deep;uMap2Deep = deepCopyUser(uMapDeep);User tempUserDeep = uMap2Deep.get("1");tempUserDeep.setName("sadsa");System.out.println(uMapDeep);System.out.println(uMap2Deep);System.out.println("");}static Map<String, Set<String>> deepCopy(Map<String, Set<String>> original) {HashMap<String, Set<String>> copy = new HashMap<>();for (Map.Entry<String, Set<String>> entry : original.entrySet()) {copy.put(entry.getKey(),new HashSet<String>(entry.getValue()));}return copy;}static Map<String, User> deepCopyUser(Map<String, User> original) {HashMap<String, User> copy = new HashMap<>();for (Map.Entry<String, User> entry : original.entrySet()) {copy.put(entry.getKey(),new User(entry.getValue().getName(),entry.getValue().getAge()));}return copy;}
}
public class User {private String name;private int age;User(String name,int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return name + age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
输出
{test=1111}
{test=1234}[[bbb, aaaa]]
[[bbb, aaaa]][[aaaa]]
[[bbb, aaaa]]{1=abc12}
{1=abc12}{1=zhangsan12}
{1=sadsa12}
Java的深拷贝的例子相关推荐
- 学习Java的深拷贝和浅拷贝
关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象.可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用 ...
- fasttext的基本使用 java 、python为例子
fasttext的基本使用 java .python为例子 今天早上在地铁上看到知乎上看到有人使用fasttext进行文本分类,到公司试了下情况在GitHub上找了下,最开始是c++版本的实现,不过有 ...
- Java基础 深拷贝浅拷贝
Java基础 深拷贝浅拷贝 非基本数据类型 需要new新空间 class Student implements Cloneable{private int id;private String name ...
- [转]jackson json字符串、map、java对象的转换例子
ackson框架 json字符串.map.java对象的转换例子 先下载框架jar包: 下面是一些例子: package jackson; import java.io.File; import ja ...
- java实现死锁简单例子,Java死锁的简单例子
Java死锁的简单例子 两个线程互相占有对方需要的资源而不释放,便形成了死锁. 代码如下: Program.java /** * 程序类 * @author michael * */ public c ...
- Java的深拷贝和浅拷贝
熟悉C++的朋友对这个话题应该很熟悉,浅拷贝就是指两个对象共同拥有同一个值,一个对象改变了该值,也会影响到另一个对象.深拷贝就是两个对象的值相等,但是互相独立.本来想把以前写的一篇文章扩充一下,没想 ...
- java 对象深拷贝_java深入理解浅拷贝和深拷贝
简介 拷贝对象是java中经常会遇到的问题.java中存在两种类型,基础类型和引用类型. java的赋值都是传值的,对于基础类型来说,会拷贝具体的内容,但是对于引用对象来说,存储的这个值只是指向实际对 ...
- java List深拷贝的两种方式
大家都知道java里面分为浅拷贝和深拷贝.举个简单的例子,区分一下浅拷贝和深拷贝的区别 public class Address{private String address;public Addre ...
- java:深拷贝与浅拷贝
拷贝的实现: 只有子类实现了Cloneable接口后才可以使用Object类提供的clone方法. protected native Object clone() throws CloneNotSup ...
最新文章
- 享有的意思是_“fuck you money”不是“x你钱”,真实意思却是这个
- php通过正则提取页面相关信息
- 并发编程(三)原子操作CAS
- selenium python 入门-元素定位
- POJ 3683 Priest John's Busiest Day(2-ST)
- 大电流场效应管500a_不可不知的电子工程常用的6大电子元器件,了解一下!
- 百度地图经纬度获取标点与城市编码
- python教材答案第四章_第四章-习题答案
- 计算机制图系统的组成,lesson02-计算机机地图制图系统的组成.ppt
- reset()方法 submit()方法
- 元语言基础技术之:在JS中如何自由地创建函数
- VS修改MFC工程的程序图标
- html英文颜色大全,html英文颜色名称全集
- 云虚拟主机☀️利用FileZilla,使用FTP协议给阿里云虚拟主机上传、下载文件
- 网站QQ客服链接代码
- mysql select having_MySQL中SELECT子句WHERE和HAVING的区别
- 股票历史数据-股票历史行情数据查询
- 推进网络强国建设,筑牢网络安全屏障
- 超牛逼!这款开源性能监控系统真强大~
- 安装、卸载mysql服务命令
热门文章
- html字体代码大全_HTML基础笔记(一)
- Python学习之旅:用Python制作一个打字训练小工具
- c#(.net)对dbf(arcgis shp属性表)的操作 (验证版)
- ASP.NET MVC 4 内容映射
- 2017年3月27日上午学习日志
- HttpHandler和HttpModule 心得介绍
- leetcode 1223 python
- mysql schema数据混乱_MySQL之Schema与数据类型优化
- 通过as写一个简单的按键_自己写一个简单的二维魔方游戏
- java求数组和值_用java编写数组求和,array[]和ArrayList()?