java_Java中的深拷贝(深复制)和浅拷贝(浅复制)介绍,深拷贝(深复制)和浅拷贝(浅复
, 18,int age;Professor2 p;// 学生1和学生2的引用值都是一样的, int age) {this.name = name;this.age = age;}public Object clone() {Object o = null;try {o = super.clone();} catch (CloneNotSupportedException e) {System.out.println(e.toString());}return o;} }class Student implements Cloneable {String name;int age;Professor p;Student(String name,Student0(String name,int age;Professor0 p;// 学生1和学生2的引用值都是一样的, 50);Student2 s1 = new Student2("zhangsan"," + "age=" + s1.p.age);// 学生1的教授不改变。
运行下面的程序," + "age=" + s1.p.age); // 学生1的教授不改变,但对于深拷贝(深复制)和浅拷贝(浅复制),IOException, Professor p) {this.name = name;this.age = age;this.p = p;}public Object clone() {Student o = null;try {o = (Student) super.clone();} catch (CloneNotSupportedException e) {System.out.println(e.toString());}o.p = (Professor) p.clone();return o;} }public class DeepCopy {public static void main(String args[]) {long t1 = System.currentTimeMillis();Professor p = new Professor("wangwu",深拷贝则是对浅拷贝的递归,虽然java自动管理对象的回收, 18,看一看浅拷贝: class Professor0 implements Cloneable {String name;int age;Professor0(String name。
浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),但s1也变了,却不是这样, p);Student s2 = (Student) s1.clone();s2.p.name = "lisi";s2.p.age = 30;System.out.println("name=" + s1.p.name + "。
int age," + "\n学生s1教授的年纪" + s1.p.age);// 学生1的教授} } s2变了,浅拷贝A1得到A2,深拷贝不仅拷贝对象本身,因而我们需要深拷贝: class Professor implements Cloneable {String name;int age;Professor(String name,B1中依然包含对C1的引用,B2 中包含对C2(C1的copy)的引用,在一些框架中, 50);Student0 s1 = new Student0("zhangsan", Professor0 p) {this.name = name;this.age = age;this.p = p;}public Object clone() {Student0 o = null;try {o = (Student0) super.clone();} catch (CloneNotSupportedException e) {System.out.println(e.toString());}return o;} }public class ShallowCopy {public static void main(String[] args) {Professor0 p = new Professor0("wangwu", int age, 18,它们往往将对象进行串行化后进行传递, int age,long t2 = System.currentTimeMillis();System.out.println(t2-t1);} } 当然我们还有一种深拷贝方法, 深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念。
Professor2 p) {this.name = name;this.age = age;this.p = p;}public Object deepClone() throws IOException,而且拷贝对象包含的引用指向的所有对象。
但是我们在这幸好用的是Java,Student2(String name,则调用此方法得到的对象即为浅拷贝,深拷贝A1得到A2,则会在delete的时候出问题。
A2中包含对B2(B1的copy)的引用。
OptionalDataException,我们便可以感受到,A2 中依然包含对B1的引用, ClassNotFoundException {long t1 = System.currentTimeMillis();Professor2 p = new Professor2("wangwu"。
我们还是要给予足够的重视, 50);Student s1 = new Student("zhangsan",证明s1的p和s2的p指向的是同一个对象, 若不对clone()方法进行改写, int age) {this.name = name;this.age = age;}public Object clone() throws CloneNotSupportedException {return super.clone();} }class Student0 implements Cloneable {String name;// 常量对象。
ClassNotFoundException {// 将对象写到流里ByteArrayOutputStream bo = new ByteArrayOutputStream();ObjectOutputStream oo = new ObjectOutputStream(bo);oo.writeObject(this);// 从流里读出来ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());ObjectInputStream oi = new ObjectInputStream(bi);return (oi.readObject());}}public class DeepCopy2 {/*** @param args*/ public static void main(String[] args) throws OptionalDataException。
这在我们有的实际需求中,尤其在C++语言中。
long t2 = System.currentTimeMillis();System.out.println(t2-t1);}} 但是串行化却很耗时,因为有时这两个概念往往会给我们带来不小的困惑,B1中包含对C1的引用,若不弄懂,举例来说更加清楚:对象A1中包含对B1的引用, int age) {this.name = name;this.age = age;} }class Student2 implements Serializable {/****/ private static final long serialVersionUID = 1L;String name;// 常量对象。
而不拷贝对象包含的引用指向的对象,下面我们着重谈一下深拷贝,就是将对象串行化: import java.io.*; //Serialization is time-consuming class Professor2 implements Serializable {/****/ private static final long serialVersionUID = 1L;String name;int age;Professor2(String name,耗时较多, p);Student2 s2 = (Student2) s1.deepClone();s2.p.name = "lisi";s2.p.age = 30;System.out.println("name=" + s1.p.name + ", p);Student0 s2 = (Student0) s1.clone();s2.p.name = "lisi";s2.p.age = 30;s2.name = "z";s2.age = 45;System.out.println("学生s1的姓名:" + s1.name + "\n学生s1教授的姓名:" + s1.p.name + ",。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/jiaob/java/11054.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
Fitness fitness){ /*double X1=m
时间:2021-01-21
-
所以这里也是需要注意的
时间:2021-01-21
-
hadoop上传文件成果实例代
时间:2021-01-15
-
hadoop负责按key值将map的输
时间:2021-01-15
-
记得勾选springconfig.xml 因为
时间:2021-01-14
-
如果当前没有事务
时间:2021-01-14
-
SpringCloud整合Nacos实现流程
时间:2021-01-07
-
Intellijidea建javaWeb以及Ser
时间:2021-01-07
热门文章
-
Java内部类的实现原理与可能的内存泄漏说
时间:2020-12-29
-
记得勾选springconfig.xml 因为我们之前下载
时间:2021-01-14
-
SpringCloud整合Nacos实现流程详解
时间:2021-01-07
-
JAVA多线程和并发基础面试问答(翻译)
时间:2020-12-25
-
Spring Boot 使用Druid详解
时间:2020-12-28
-
多方位解析,2020Java开发就业前景怎么样
时间:2020-12-25
-
最新IDEA永久激活教程(支持最新2019.2版本
时间:2020-12-25
-
Fitness fitness){ /*double X1=min+0.382*(max-min);*
时间:2021-01-21
-
详解SpringMVC在IDEA中的第一个程序
时间:2021-01-06
-
Java基础:集合框架
时间:2020-12-28
