JavaSE知识集锦(1)深拷贝与浅拷贝
2016-03-13 10:47
393 查看
1、关于深拷贝和浅拷贝
什么是拷贝?
Object类中有clone方法,是native的代码。但是如果不显式地重写clone方法,将不能直接调用。如果自定义的类没有实现Cloneable接口,将会抛出java.lang.CloneNotSupportedException错误。
拷贝的原理是在内存中新开辟一块区域,然后完全拷贝旧那块的内容到新那块去,无论是引用类型还是基本类型。
Notice:新clone出来的对象和原来不是一个对象,hashCode值是不一样的。
深拷贝与浅拷贝:
clone的一个危险的地方在于,拷贝引用类型时,拷贝的是引用,它们都指向同一块区域,这样很容易出现修改一个类,改变另一个类的情况。
输出结果是1,说明a指向的区域被b所改动。这就是所谓的浅拷贝。
要实现深拷贝,应该对类的每一个成员变量都显式调用clone。
现在输出结果是2了。
什么是拷贝?
Object类中有clone方法,是native的代码。但是如果不显式地重写clone方法,将不能直接调用。如果自定义的类没有实现Cloneable接口,将会抛出java.lang.CloneNotSupportedException错误。
拷贝的原理是在内存中新开辟一块区域,然后完全拷贝旧那块的内容到新那块去,无论是引用类型还是基本类型。
Notice:新clone出来的对象和原来不是一个对象,hashCode值是不一样的。
深拷贝与浅拷贝:
clone的一个危险的地方在于,拷贝引用类型时,拷贝的是引用,它们都指向同一块区域,这样很容易出现修改一个类,改变另一个类的情况。
class B { int i = 2; } class A implements Cloneable { B b = new B(); @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } public class Source { public static void main(String[] args) throws Exception { A a = new A(); A b = (A) a.clone(); b.b.i = 1; System.out.println(a.b.i); } }
输出结果是1,说明a指向的区域被b所改动。这就是所谓的浅拷贝。
要实现深拷贝,应该对类的每一个成员变量都显式调用clone。
class B implements Cloneable { int i = 2; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class A implements Cloneable { B b = new B(); @Override protected Object clone() throws CloneNotSupportedException { A a = (A) super.clone(); a.b = (B) b.clone(); return (Object) a; } } public class Source { public static void main(String[] args) throws Exception { A a = new A(); A b = (A) a.clone(); b.b.i = 1; System.out.println(a.b.i); } }
现在输出结果是2了。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树