java 深淺拷貝(克隆)

一、重寫clone方法

克隆一個對象,該對象要實現克隆接口,即 implements Cloneable,重寫克隆方法

如下代碼:


public class Teacher implements Cloneable {

    public int getTno() {
		return tno;
	}
	public void setTno(int tno) {
		this.tno = tno;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	private int tno;
    private String name;
    
    @Override
    protected Object clone() {
        Teacher teacher = null;
        try {
            teacher = (Teacher)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return teacher;
    }
  
}

當裏面有更深層的引用的時候,被引用的類也實現克隆方法, 如下:學生引用老師,如果想實現深拷貝,要重寫學生類的克隆方法。


import org.junit.Test;

public class Student implements Cloneable{


    public int getSno() {
		return sno;
	}

	public void setSno(int sno) {
		this.sno = sno;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	private int sno ;
    private String name;
    public Teacher getTeacher() {
		return teacher;
	}

	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}
    // 引用老師
	private Teacher teacher;



    @Override
    public Object clone() throws CloneNotSupportedException {
        Student s = null;
        try{
            s = (Student)super.clone();
            // 引用也克隆和設置下
            Teacher t = (Teacher)this.teacher.clone();
            s.setTeacher(t);
        }catch (Exception e){
            e.printStackTrace();
        }
        return s;
    }

}

二、序列化實現克隆

//工具方法
  public Object cloneObject(Object object) throws IOException, ClassNotFoundException {
        //將對象序列化
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        objectOutputStream.writeObject(object);

        //將字節反序列化
        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        Object obj = objectInputStream.readObject();

        return obj;
    }

重寫clone方法 與 通過序列化 兩種拷貝方式比較:

clone方法:

優點:速度快,效率高

缺點:在對象引用比較深時,使用此方式比較繁瑣

 

通過序列化:

優點:非常簡便的就可以完成深度copy

缺點:由於序列化的過程需要跟磁盤打交道,因此效率會低於clone方式

 

如何抉擇?

實際開發中,根據兩種方式的優缺點進行選擇即可!

 

參考原文:https://www.cnblogs.com/lzzRye/p/9459465.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章