Summary

浅克隆与深克隆对于JavaSE来说,是个难度系数比较低的概念,但不应该轻视它。

假设一个场景:对于某个list,代码里并没有任何对其的直接操作,但里面的元素的属性却被改变了,这可能就涉及到这个概念。

 

Description

浅克隆指仅copy对象位于栈内存中的引用(reference)。copy后,新旧两个引用指向同一个堆内存对象(即同一内存区域),但是堆内存中实际的对象copy前后均只有一个。使用"==" operator比较二者的地址会返回true。(不同引用,同一对象)

深克隆指则会copy一个新的对象并返回相应引用,即开辟了新的堆内存空间,因此使用“==” operator来比较两者的地址时会返回false。(不同引用,不同对象)

 

浅克隆(shallow clone)

  1. clone对象是实例对象时,使用“=”操作符进行浅克隆。
  2. clone对象是对象数组的元素时,使用 System.arraycoppy() 进行浅克隆。(你非得要用"=" foreach地clone也没人拦着)

jdk中显式定义的clone操作基本上都使用:

1 System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

例如ArrayList中的clone()、Arrays.copyOf()等对具体数组的clone其实底层都是调用该方法。

 1 package com.scv.test.clone;
 2 
 3 public class ShallowCloneTest {
 4 
 5     public static void main(String[] args) throws Exception {
 6         Zerg z0 = new Zerg();
 7         Zerg z1 = z0;
 8         System.out.println("0. " + (z0 == z1));//"="操作符用于对象的浅克隆
 9         
10         Zerg[] array0 = new Zerg[]{new Zerg(), new Zerg()};
11         Zerg[] array1 = new Zerg[array0.length];
12         System.arraycopy(array0, 0, array1, 0, array0.length);//System.arraycopy()用于数组的浅克隆
13         System.out.println("1. " + (array0 == array1));
14         for(int i = 0; i < array0.length; i++){
15             System.out.println("Comparing element of array:" + (array0[i] == array1[i]));
16         }
17     }
18     
19 }
20 
21 class Zerg{
22     
23 }
24 
25 /* Output:
26 0. true
27 1. false
28 Comparing element of array:true
29 Comparing element of array:true
30 */
验证Shallow Clone

相关文章: