1-02 深克隆與淺克隆

1-02 深克隆與淺克隆

what 定義

深拷貝與淺拷貝

jdk有個接口java.lang.Cloneable
這個接口是空接口,裏面什麼東西都沒有
它的意思是實現了這個接口的類都是可以克隆的
真正實現了clone方法的是java.lang.Object父類
由此可見,每一個類都是有clone()方法的
但是這個clone()只是一個淺克隆方法

淺克隆定義: 複製出來的對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象

深克隆定義: 複製出來的所有變量都含有與原來的對象相同的值,那些引用其他對象的變量將指向複製出來的新對象,而不再是原有的那些被引用的對象.

換言之,深克隆把要克隆的對象所引用的對象都克隆了一遍

圖解

淺克隆

WechatIMG229

深克隆

WechatIMG230

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();
		}


	}
}

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