Java深拷贝和浅拷贝

深拷贝与浅拷贝

浅拷贝

可以实现Clonable接口并重写Object类的clone()方法来进行浅拷贝

public Object clone() { 
  //浅拷贝 
  try { 
     // 直接调用父类的clone()方法
     return super.clone(); 
  } catch (CloneNotSupportedException e) { 
     return null; 
  } 
} 

微信截图_20211125135602
浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝

如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。

深拷贝

也可以通过实现Clonable接口并重写Object类的clone()方法来进行深拷贝

public Object clone() { 
  // 深拷贝,创建拷贝类的一个新对象,这样就和原始对象相互独立
  Student s = new Student(name, subj.getName()); 
  return s; 
} 

20200418175734940_5048

深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。

序列化进行拷贝

序列化属于深拷贝

如何选择拷贝方式

  1. 如果对象的属性全是基本类型的,那么可以使用浅拷贝。
  2. 如果对象有引用属性,那就要基于具体的需求来选择浅拷贝还是深拷贝。
    意思是如果对象引用任何时候都不会被改变,那么没必要使用深拷贝,只需要使用浅拷贝就行了。如果对象引用经常改变,那么就要使用深拷贝。没有一成不变的规则,一切都取决于具体需求。

Java深拷贝和浅拷贝
https://www.blaaair.com/archives/java-shen-kao-bei-he-qian-kao-bei
作者
Glo6f
发布于
2022年08月29日
许可协议