1-02 深克隆與淺克隆
what 定義
深拷貝與淺拷貝
jdk有個接口java.lang.Cloneable
這個接口是空接口,裏面什麼東西都沒有
它的意思是實現了這個接口的類都是可以克隆的
真正實現了clone方法的是java.lang.Object
父類
由此可見,每一個類都是有clone()
方法的
但是這個clone()
只是一個淺克隆方法
淺克隆定義: 複製出來的對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象
深克隆定義: 複製出來的所有變量都含有與原來的對象相同的值,那些引用其他對象的變量將指向複製出來的新對象,而不再是原有的那些被引用的對象.
換言之,深克隆把要克隆的對象所引用的對象都克隆了一遍
圖解
淺克隆
深克隆
how 例子
package hutool;
import cn.hutool.core.util.ObjectUtil;
import org.junit.Test;
/**
* hutool工具core測試例子
*
* @author suwenguang
**/
public class CoreTest {
/**
* 深克隆與淺克隆
* @author suwenguang
*/
@Test
public void cloneTest() {
//淺克隆直接調用object的clone()方法,但是前提必須先實現cloneable接口,否則拋出cloneNotSupport異常
TestObject testObject = new TestObject();
testObject.setTestObject(new TestObject());
try {
Object clone = testObject.clone();
//==判斷的是內存引用的地址,克隆的對象雖然值一樣,但是從內存上看 已經是不同的內存地址了
System.out.println("淺克隆"+(clone == testObject));
System.out.println("淺克隆"+clone.equals(testObject));
System.out.println("淺克隆"+testObject.hashCode());
System.out.println("淺克隆"+clone.hashCode());
// 淺克隆的對象 裏面成員屬性的 地址應該是一樣的, 所以這裏equals應該還是true
System.out.println("淺克隆"+testObject.getTestObject().equals(((TestObject) clone).getTestObject()));
// 這裏使用hutool的深克隆方法,前提是對象必須實現序列化接口serializable
TestObject another = ObjectUtil.cloneByStream(testObject);
//==判斷的是內存引用的地址,克隆的對象雖然值一樣,但是從內存上看 已經是不同的內存地址了
System.out.println("深克隆"+(clone == another));
System.out.println("深克隆"+clone.equals(another));
System.out.println("深克隆"+another.hashCode());
System.out.println("深克隆"+clone.hashCode());
// 深克隆的對象 裏面成員屬性的 地址應該是不一樣的, 所以這裏equals應該還是false
System.out.println("深克隆"+testObject.getTestObject().equals(another.getTestObject()));
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}