3.Java中的深拷贝和浅拷贝的区别
在解释深浅拷贝前先了解一个数据在Java语言中的类别和存储形式。
我们都知道在Java中,数据都叫做对象,拷贝也是针对对象来做的。在Java中存在基本数据类型和引用数据类型。通俗一点讲,
所有需要“new”的都叫做引用数据类型。而这两类的数据存储时也大不相同。基本数据类型一般是存在栈中,而引用数据类型存在堆内存中。而大部分的基本数据类型的拷贝是在对象实例中发生的,在这里我们只讨论引用数据类型的拷贝。
所谓深浅拷贝,我用一个例子来解释一下。我有一只羊,叫小羊(对象),我要对它进行浅拷贝,我先看看这只羊都有什么特性呢,这只羊呢有四肢(基本数据类型),皮毛(基本数据类型),内脏(基本数据类型),还有一个脑子(引用数据类型),这时候我拷贝一只羊1,这个羊1是从小羊拷贝过来的,所以她也有四肢(基本数据类型),皮毛(基本数据类型),内脏(基本数据类型),但是这个羊1的脑子拷贝的是指向小羊脑子的一个地址,虽然我最后获得了两只羊,但是羊1和小羊是共用一个脑子的,如果小羊的脑子坏掉了,羊1的脑子同样也是坏掉的。这就是浅拷贝。
而深拷贝是我有一只小羊,它有四肢(基本数据类型),皮毛(基本数据类型),内脏(基本数据类型),还有一个脑子(引用数据类型),然后我对它进行拷贝,获得了一个羊2,这个羊2也有四肢(基本数据类型),皮毛(基本数据类型),内脏(基本数据类型),还有一个脑子(引用数据类型),但是呢,羊2虽然有和小羊同样的属性,但是从拷贝完成开始,它们就是两个完全独立的个体。加入我准备从羊2身上割一个羊脑吃掉,羊2必然归西了,但是小羊还是活蹦乱跳的。它们两个是互不影响的。
所谓深浅拷贝,其实是在拷贝对象时,对类的实例对象这种引用类型的不同操作而已。
Java中实现拷贝的方法是类需要实现Cloneable接口,并且覆写clone()方法,来表明这个类是可以被拷贝的。不过这个拷贝是浅拷贝。
深拷贝有3种方法,使用构造函数拷贝;重写Object的clone;序列化。
太困了,写不下去了,深拷贝的3种方法,有机会再补上。GOODNIGHT!
标签:基本,脑子,Java,小羊,基础,数据类型,面试,拷贝 From: https://www.cnblogs.com/stying/p/17242067.html