南京市网站建设_网站建设公司_百度智能云_seo优化
2026/1/13 17:25:18 网站建设 项目流程

深拷贝和浅拷贝区别

章节目录

文章目录

  • 深拷贝和浅拷贝区别
  • 1. 什么是浅拷贝?浅拷贝?
  • 2. 浅拷贝和深拷贝的区别是什么?
  • 3. **如何实现深拷贝和浅拷贝?**
  • 4. **深拷贝的实现方式有哪些?**

1. 什么是浅拷贝?浅拷贝?

浅拷贝是指复制对象时,只复制对象本身,而不复制对象引用的其他对象。浅拷贝后,新对象和原对象共享引用的其他对象。

深拷贝是指复制对象时,不仅复制对象本身,还递归地复制对象引用的其他对象。深拷贝后,新对象和原对象完全独立。

2. 浅拷贝和深拷贝的区别是什么?

  • 浅拷贝:只复制对象本身,引用的其他对象不复制,新对象和原对象共享引用的其他对象。

  • 深拷贝:递归地复制对象及其引用的所有对象,新对象和原对象完全独立。

拷贝的程度:

  • 浅拷贝只拷贝对象的引用,不创建新的对象实例。拷贝后的对象与原始对象共享同一份数据,对其中一个对象的修改会影响到另一个对象。

  • 深拷贝创建一个全新的对象实例,并将原始对象的所有属性值复制到新对象中。拷贝后的对象与原始对象是独立的,对任一对象的修改不会影响另一个对象。

对象引用:

  • 浅拷贝只复制对象引用,新旧对象仍然指向同一块内存空间,修改其中一个对象的属性会影响另一个对象。

  • 深拷贝会复制对象本身以及对象引用指向的其他对象,所有对象的引用都将指向全新的内存空间。

性能开销:

  • 浅拷贝的性能开销较小,因为仅复制对象的引用。

  • 深拷贝的性能开销较大,因为需要创建新的对象实例并复制所有属性。

3.如何实现深拷贝和浅拷贝?

  • 浅拷贝:使用Object.clone()方法,或者通过构造方法或手动复制字段

  • 深拷贝:手动实现深拷贝,或者使用序列化。

4.深拷贝的实现方式有哪些?

  • 手动实现:手动实现深拷贝是最直接的方法,通过逐个复制对象的字段来实现。这种方法需要对对象的内部结构有详细的了解,并且需要递归地复制所有引用的对象。

    publicclassDeepCopyExampleimplementsCloneable{privateintid;privateStringname;privateAddressaddress;publicDeepCopyExample(intid,Stringname,Addressaddress){this.id=id;this.name=name;this.address=address;}@OverrideprotectedObjectclone()throwsCloneNotSupportedException{// 手动实现深拷贝DeepCopyExamplecopy=(DeepCopyExample)super.clone();copy.address=(Address)this.address.clone();// 深拷贝地址returncopy;}publicstaticvoidmain(String[]args){Addressaddress=newAddress("123 Main St","City");DeepCopyExampleoriginal=newDeepCopyExample(1,"John",address);try{DeepCopyExamplecopy=(DeepCopyExample)original.clone();System.out.println("Original Address: "+original.address);System.out.println("Copy Address: "+copy.address);// 修改地址copy.address.setStreet("456 New St");System.out.println("After modification:");System.out.println("Original Address: "+original.address);System.out.println("Copy Address: "+copy.address);}catch(CloneNotSupportedExceptione){e.printStackTrace();}}}classAddressimplementsCloneable{privateStringstreet;privateStringcity;publicAddress(Stringstreet,Stringcity){this.street=street;this.city=city;}@OverridepublicObjectclone()throwsCloneNotSupportedException{returnsuper.clone();}publicStringgetStreet(){returnstreet;}publicvoidsetStreet(Stringstreet){this.street=street;}@OverridepublicStringtoString(){return"Address{"+"street='"+street+'\''+", city='"+city+'\''+'}';}}
  • 序列化:序列化是另一种实现深拷贝的方法。通过将对象序列化为字节流,然后再反序列化为新对象,可以实现深拷贝。这种方法适用于所有实现了Serializable接口的类。

    publicclassDeepCopyWithSerialization{publicstatic<TextendsSerializable>TdeepCopy(Tobj)throwsIOException,ClassNotFoundException{// 将对象序列化为字节流ByteArrayOutputStreambyteArrayOutputStream=newByteArrayOutputStream();ObjectOutputStreamobjectOutputStream=newObjectOutputStream(byteArrayOutputStream);objectOutputStream.writeObject(obj);// 将字节流反序列化为新对象ByteArrayInputStreambyteArrayInputStream=newByteArrayInputStream(byteArrayOutputStream.toByteArray());ObjectInputStreamobjectInputStream=newObjectInputStream(byteArrayInputStream);return(T)objectInputStream.readObject();}publicstaticvoidmain(String[]args){Addressaddress=newAddress("123 Main St","City");DeepCopyExampleoriginal=newDeepCopyExample(1,"John",address);try{DeepCopyExamplecopy=DeepCopyWithSerialization.deepCopy(original);System.out.println("Original Address: "+original.address);System.out.println("Copy Address: "+copy.address);// 修改地址copy.address.setStreet("456 New St");System.out.println("After modification:");System.out.println("Original Address: "+original.address);System.out.println("Copy Address: "+copy.address);}catch(Exceptione){e.printStackTrace();}}}
  • 第三方库:一些第三方库(如 Apache Commons Lang)提供了深拷贝的功能,可以简化代码。

    publicclassDeepCopyWithApacheCommons{publicstatic<T>TdeepCopy(Tobj){returnSerializationUtils.clone(obj);}publicstaticvoidmain(String[]args){Addressaddress=newAddress("123 Main St","City");DeepCopyExampleoriginal=newDeepCopyExample(1,"John",address);DeepCopyExamplecopy=DeepCopyWithApacheCommons.deepCopy(original);System.out.println("Original Address: "+original.address);System.out.println("Copy Address: "+copy.address);// 修改地址copy.address.setStreet("456 New St");System.out.println("After modification:");System.out.println("Original Address: "+original.address);System.out.println("Copy Address: "+copy.address);}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询