JavaSE知识集锦深拷贝与浅拷贝
Posted tanxiaxuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE知识集锦深拷贝与浅拷贝相关的知识,希望对你有一定的参考价值。
1、关于深拷贝和浅拷贝
什么是拷贝?
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了。
以上是关于JavaSE知识集锦深拷贝与浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章