美文网首页
Java之深浅clone

Java之深浅clone

作者: 任嘉平生愿 | 来源:发表于2019-11-01 17:48 被阅读0次

浅克隆

浅度克隆对于要克隆的对象,对于其基本数据类型的属性,复制一份给新产生的对象,对于非基本数据类型的属性,仅仅复制一份引用给新产生的对象,即新产生的对象和原始对象中的非基本数据类型的属性都指向的是同一个对象。

深克隆

深克隆简单的说就是:除了克隆自身对象,还对其他非基本数据类型的引用的其他以外的所有对象,都克隆了一遍。

java代码实战:
package deepshallowclone;


import java.io.IOException;

class DeepAndShallow {

    public static void main(String []args) throws CloneNotSupportedException, IOException, ClassNotFoundException {
        Son son = new Son();
        son.setName("son1");
        son.setAge(10);
        Father father1 = new Father();
        father1.setName("father1");
        father1.setAge(40);
        father1.setSon(son);
        //这是一个个引用
        //father2=father1;
        //这是一个浅拷贝
        //Father father2 = (Father)father1.clone();
        //这是一个深拷贝
        Father father2 = (Father)father1.deepClone();
        father2.getSon().setName("son2");
        System.out.println(father1.getSon().getName());
        father2.setName("father2");
        System.out.println(father1.getName());

    }



}


package deepshallowclone;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.*;

@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Father implements Serializable, Cloneable {
    private String name;
    private Integer age;
    private Son son;

    protected Object clone() throws CloneNotSupportedException {
        Father cloned = (Father) super.clone();
        return cloned;
    }

    public Father deepClone() throws IOException, ClassNotFoundException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(this);
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return (Father) ois.readObject();
    }
}

package deepshallowclone;

import lombok.Data;

import java.io.Serializable;

@Data
public class Son implements Serializable {
    private String name;
    private Integer age;
}

依次将上面的注解打开得到下面的结果
这是一个引用
son2
father2
这是一个浅拷贝
son2
father1
这是一个深拷贝
son1
father1

分析

1.Father father2=father1

这只是一个常规的引用所以father2指向的是father1的内存区域

2.Father father2 = (Father)father1.clone()

father2复制了father1的对象但是son这个对象任然是father2中的son指针指向的是father1的son的内存区域

注意Father一定要实现Cloneable接口
3.Father father2 = (Father)father1.deepClone()

这个是通过先序列化father1然乎再反序列化生成的一个father2新对象。

注意Father和Son两个类一定要实现Serializable接口

注意:

(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)都是相当于克隆中的浅克隆。

以下是简单的性能分析:

cglib BeanCopier 15ms

Spring BeanUtil 4031ms

apache BeanUtils 18514ms.

相关文章

  • Java之深浅clone

    浅克隆 浅度克隆对于要克隆的对象,对于其基本数据类型的属性,复制一份给新产生的对象,对于非基本数据类型的属性,仅仅...

  • clone之深浅

    1.clone() 是Object类中的一个方法,可以实现对象的克隆。(区别于赋值只能赋值引用) 2.浅克隆与深克...

  • java基础之Clone

    1.代码 2.运行结果

  • Java之深浅拷贝

    Java之深浅拷贝 基本类型:拷贝数据的值其他类型:拷贝地址的引用,拷贝出的新对象与原对象共享实例变量,不受访问权...

  • java之深浅堆

    浅堆 表示一个对象结构所占用的大小(对象头+实例数据+对齐填充,不包括内部引用 对象大小) 深堆 表示一个对象被 ...

  • Java Clone

    Java Clone 平时项目中用的也不多,今天来实践下Java的Clone。Clone主要分为“浅拷贝”与“深拷...

  • Java Clone 学习

    Java Clone 学习 原文地址:详解Java中的clone方法 通常在Java中我们通过new关键字创建对象...

  • Java Object之clone()方法

    Object中的clone方法定义如下:protected native Object clone() throw...

  • Java Clone

    Java深复制与浅复制 https://blog.csdn.net/accp_fangjian/article/d...

  • 详解Java中的clone方法 -- 深拷贝和浅拷贝

    Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。...

网友评论

      本文标题:Java之深浅clone

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