美文网首页
JAVA深拷贝和浅拷贝

JAVA深拷贝和浅拷贝

作者: 独自闯天涯的码农 | 来源:发表于2022-03-30 00:06 被阅读0次

一、引言

对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象
中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的
部分或全部教据。
Java中有三种类型的对象拷贝:

  • 浅拷贝(Shallow Copy)
  • 深拷贝(Deep Copy)
  • 延迟拷贝(Lazy Copy)。

二、浅拷贝

1、什么是浅拷贝

浅浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。

2、浅拷贝实现

public class MyCopy implements Cloneable{
   
   @NonNull
   @Override
   protected Object clone() throws CloneNotSupportedException {
      return super.clone();
   }
}

1、实现接口Cloneable;
2、重写clone(),并调用super.clone();

三、深拷贝

1、什么是深拷贝

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

2、深拷贝实现

public class MyCopy implements Cloneable{
   private Attr attr;

   public MyCopy(Attr attr) {
      this.attr = attr;
   }

   @NonNull
   @Override
   protected Object clone() throws CloneNotSupportedException {
      Attr attr = new Attr();
      MyCopy myCopy = new MyCopy(attr);
      return myCopy;
   }

   public class Attr{

   }
}

1、实现接口Cloneable;
2、重写clone(),创建新对象,如果有引用类型属性,也重新创建;

3、通过序列化实现深拷贝

只需要做以下几件事儿:

  • 确保对象图中的所有类都是可序列化的
  • 创建输入输出流;
  • 使用这个输入输出流来创建对象输入和对象输出流
  • 将你想要拷贝的对象传递给对象输出流
  • 从对象输入流中读取新的对象并且转换回你所发送的对象的类;

注意,序列化这种方式有其自身的限制和问题:
因为无法序列化transient变量,使用这种方法将无法拷贝transient变量。
再就是性能问题。创建一个socket, 序列化一个对象,通过socket传输它,然后反序列化它,这个过程与调用已有对象的方法相比是很慢的。所以在性能上会有天壤之别。如果性能对你的代码来说是至关重要的,建议不要使用这种方式。它比通过实现Clonable接口这种方式来进行深拷贝几乎多花100倍的时间。

四、延迟拷贝

延迟拷贝是浅拷贝和深拷贝的一个组合,实际上很少会使用。当最开始拷贝一个对象时,会使用速度较快的浅拷贝,还会使用一个计数器来记录有多少对象共享这个数据。当程序想要修改原始的对象时,它会決定数据是否被共享(通过检查计数器)并根据需要进行深拷贝。

延迟拷贝从外面看起来就是深拷贝,但是只要有可能它就会利用浅拷贝的速度。当原始对象中的引用不经常改变的时候可以使用延迟拷贝。由于存在计数器,效率下降很高,但只是常量级的开销。而且,在某些情况下,循环引用会导致一些问题。

五、选择拷贝

  • 对象的属性全是基本类型的:使用浅拷贝,
  • 对象有引用属性:
    1、如果对象引用任何时侯都不会被改变,使用浅拷贝。
    2、如果对象引用经常改变,那么就要使用深拷贝。

相关文章

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • Java基础 - 深拷贝和浅拷贝

    Java 的深拷贝和浅拷贝 什么是深拷贝、浅拷贝 (深克隆、浅克隆)? 在 Java 中,数据类型分为 基本数据类...

  • java中的深拷贝和浅拷贝

    简单记录一下java中的深拷贝和浅拷贝,深拷贝和浅拷贝只是针对对象而言的. 1 深拷贝代码 2 浅拷贝代码 3 测...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • Java------List的深拷贝与浅拷贝

    Java的浅拷贝(Shallow Copy)、深拷贝(Deep Copy)。 浅拷贝(Shallow Copy) ...

  • Java的浅拷贝和深拷贝

    首先需要明白,浅拷贝和深拷贝都是针对一个已有对象的操作。那先来看看浅拷贝和深拷贝的概念。 在 Java 中,除了基...

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

  • 深克隆--何时是尽头?

    As we all know Java有两种拷贝,浅拷贝和深拷贝,高大上的叫法也叫浅克隆和深克隆。 深克隆有时会碰...

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

  • 关于Java的浅拷贝和深拷贝

    浅拷贝和深拷贝是什么? 浅拷贝和深拷贝都是针对已经存在了的对象的操作,在java中,基本数据类型有八种,和引用数据...

网友评论

      本文标题:JAVA深拷贝和浅拷贝

      本文链接:https://www.haomeiwen.com/subject/rlfijrtx.html