首页 资讯 社群 我的社区 搜索

关于java中对象Clone的问题

高大上
2019-06-12 20:07:40

最近在看spring源码,发现spring对bean的管理主要有两种:

1.是基于注册式的单利模式

2.就是对象克隆。

以前一直没接触过clone,就上学时听老师提过,现在也基本忘光了。这里记录下:

java中的对象对象创建有两种方式:1.通过new,第二种就是clone。他们两者其实差不多,但是clone的性能消耗相对较小。而且最重要的是,如果你的对象中已经包含了数据,而这部分数据的获取又非常耗时。此时,你可以考虑先new出一个对象后将数据放入其中,在对该对象进行clone。这样获取到的新对象也会拥有你需要的那部分数据。对原始对象修改时也不会影响clone对象的数据。而你重新new出来的对象,数据都是空的。

但是需要注意:JDK默认的clone属于浅拷贝,即clone只会拷贝基本数据,对于对象中的引用数据,只会拷贝数据指针。要实现深度拷贝,需要对引用对象属性也实现clone方法,例如:

package com.example.demo.Cloneable;

import lombok.Data;

/**
 * @Author: hcy
 * @Date: 2019/6/12 19:15
 */
@Data
public class Person implements Cloneable {

    private String name;
    private String password;
    private String[] arr;//引用数据

    public Person(String name,String password,String[] arr){
        this.name =name;
        this.password = password;
        this.arr = arr;
    }

    @Override
    protected Object clone() {
        Person person = null;
        try {
            person = (Person) super.clone();
            //person.arr = arr.clone();//需要对引用对象也实现clone方法才能实现深度clone,没有这句话就是浅拷贝
            return person;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }

}
用户评论