java复制对象之深拷背
在java开发中,有时我们需要复制对象,并且确保修改复制得到的对象不会影响原来的对象。
于是,有些人可能会写出类似以下的代码:
public class CloneTest {
public static void main(String[] args) {
JSONObject paramJson= new JSONObject();
paramJson.put("age",26);
paramJson.put("name","lin");
JSONObject cloneJson= paramJson;
cloneJson.put("test",27);
System.out.println("paramJson:"+paramJson.toString());
System.out.println("cloneJson:"+cloneJson.toString());
}
}
运行结果为:
paramJson:{"age":27,"name":"lin"}
cloneJson:{"age":27,"name":"lin"}
发现赋值得到的对象改变时,原来的对象也随之改变。
在值传递与引用传递中已经讲到,
引用类型传参或赋值,新的对象改变时,原来的对象也会改变。
那么,如何确保修改复制得到的新对象不会影响原来的对象呢?
深拷背和浅拷背
复制对象,修改新对象不会影响原来的对象。这其实就是深拷背。
而修改复制得到的新对象会影响原来的对象,则是浅拷背。
从值和引用的角度理解,概念如下:
1.浅拷贝: 将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用
2.深拷贝: 创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”
在java的超类Object中,有一个clone()方法,默认的是浅拷背。
protected Object clone()
throws CloneNotSupportedException
那么,如何实现深拷背呢?
深拷背的实现
有几个工具类可以使用深拷背。
1.BeanUtils。
注意,最好使用Spring的BeanUtils,不要用Apache-Commons的BeanUtils。
阿里巴巴java规范手册中提到,Apache BeanUtils性能较差,可以使用 Spring BeanUtils 或者 Cglib BeanCopier 来代替。
public class DeepCloneTest {
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
JSONObject paramJson= new JSONObject();
paramJson.put("age",26);
paramJson.put("name","lin");
JSONObject cloneJson= new JSONObject();
BeanUtils.copyProperties(cloneJson,paramJson);
cloneJson.put("test",27);
System.out.println("paramJson:"+paramJson.toString());
System.out.println("cloneJson:"+cloneJson.toString());
}
}
运行结果:
paramJson:{"name":"lin","age":26}
cloneJson:{"test":27}
2.apache-commons包的SerializationUtils。**SerializationUtils要求对象必须实现序列化接口 **
public class DeepCloneTest {
public static void main(String[] args) {
JSONObject paramJson= new JSONObject();
paramJson.put("age",26);
paramJson.put("name","lin");
JSONObject cloneJson=SerializationUtils.clone(paramJson);
cloneJson.put("age",27);
System.out.println("paramJson:"+paramJson.toString());
System.out.println("cloneJson:"+cloneJson.toString());
}
}
运行结果:
paramJson:{"name":"long","age":26}
cloneJson:{"name":"long","age":27}
java复制对象之深拷背的更多相关文章
- Java中对象的深复制和浅复制详解
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...
- c# 对象的深拷备
C# 引用类型对象在拷备时,一般有浅拷备与深拷备,浅拷备指向的是同一对象的引用地址,一个对象的修改必然会影响另一个对象,而深拷备是直接拷备对象的内容,而不是引用,拷备后的对象拥有新的引用,这里主要介绍 ...
- java 复制对象 (克隆接口 与 序列化)
关于java对象复制我们在编码过程经常会碰到将一个对象传递给另一个对象,java中对于基本型变量采用的是值传递,而对于对象比如bean传递时采用的是应用传递也就是地址传递,而很多时候对于对象传递我们也 ...
- java复制对象,复制对象属性,只可复制两个对象想同的属性名。也可自定义只复制需要的属性。
注意:使用时copy()方法只会复制相同的属性.常用的copy()方法.以下为封装的工具和使用方式. 1.封装类 import java.util.Map; import java.util.Weak ...
- java hasmap对象的深复制实现:字节码复制和对象序列化成字符串复制比较。
/** * Created by Administrator on 2016/11/23. */ public class test { public static void main(String[ ...
- js 复制对象的深复制与浅复制
1.潜复制(修改新对象会改变原对象) var baz = {a:'hello', b: {c:'my', d:'friend'}} var foo = baz foo.a="better&q ...
- Java中的clone()----深复制,浅复制
这篇文章主要介绍了Java中对象的深复制(深克隆)和浅复制(浅克隆) ,需要的朋友可以参考下 1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他 ...
- OC基础16:复制对象
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.浅复制即是指针赋值,复制对象的修改会影 ...
- java对象实现深复制的方法
p2 = (Person)org.apache.commons.lang3.ObjectUtils.cloneBean(p); Person p2 = new Person(); p2 = (Pers ...
随机推荐
- Python3字典与集合
一.Python3字典 字典是另一种可变容器模型,且可存储任意类型对象字典的每个键值(key=>value)对用冒号":"分割,每个键值对之间用逗号"," ...
- jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jquery筛选方法
jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jq ...
- comet oj #7
A 签到题 题目描述 多次询问,每次询问给一个值域范围 [l,r][l,r],要回答下列四个问题: 从这个范围内选出两个整数(两个数可相同), (1) 这两个数的最小公倍数最大是多少? (2) 这两个 ...
- spark的存储系统--BlockManager源码分析
spark的存储系统--BlockManager源码分析 根据之前的一系列分析,我们对spark作业从创建到调度分发,到执行,最后结果回传driver的过程有了一个大概的了解.但是在分析源码的过程中也 ...
- JavaScript设计模式与开发实践随笔(一)
编程语言按照数据类型大体可以分为两类,一类是静态类型语言,另一类是动态类型语言. 静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行的时 候,待变量被赋予某个值之后,才会具有 ...
- 创建mybatis的逆向工程
1.mybatis的逆向工程(我使用的是maven仓库创建) 工作原理:反向工程(通过数据库中的表和字段信息去生成对应的增删改查方法) 其实就是一个自动生成工具 生成实体类(pojo)和映射文件(ma ...
- Golang: 解析JSON数据之三
前面我们介绍了 Marshal 和 Unmarshal 方法,今天再解一下另外两个 API:Encoder 和 Decoder. Encoder Encoder 主要负责将结构对象编码成 JSON 数 ...
- 【Axure】原型设计工具的概览与初识
软件工程综合实践第三次个人作业 作业要求:通过搜索资料和自学,了解原型设计的工具 前言: Axure是一款强大的原型设计工具,具有比较大的用户基础,在此前提下沟通.传输.修改就显得十分方便,并且在细节 ...
- free - 显示系统内存信息
free - Display amount of free and used memory in the system 显示系统中空闲和已使用内存的数量 格式: free [options] opti ...
- Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇
Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Internet与中国 Internet最早来源于美 ...