Java一维数组拷贝:clone()方法

先上一段代码:

import java.util.Arrays;

/**
 * clone
 * 数组中存储的内容,如果存储的是对象,那么就是浅克隆(浅拷贝),传递的是引用。
 * 相反,则是深克隆(深拷贝)
 * @author HailongYao
 */
public class Arr2 {

    public static void main(String[] args) {
        String[] a = {"a", "b", "c"};
        String[] clone = a.clone();
        System.out.println(Arrays.equals(a,clone));//比较两个数组中的所有元素
        System.out.println(a==clone);
    }

}

本文探讨利用clone()方法实现对数组的拷贝。


第二种一维数组的拷贝方式:clone() 方法实现数组拷贝

同样的,先看看基本数据类型的数组的拷贝:

import java.util.Arrays;
public class TestDemo {
    public static void main(String[] args) {

        int[] array1 = new int[]{1, 2, 8, 7, 6};
        int[] array2 = new int[array1.length];
        array2 = array1.clone();

        System.out.println("array1 = " + Arrays.toString(array1));
        System.out.println("array2 = " + Arrays.toString(array2));
        System.out.println("======================");

        array2[0] = 100;
        System.out.println("array1 = " + Arrays.toString(array1));
        System.out.println("array2 = " + Arrays.toString(array2));
    }
}
   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

这段程序的输出结果是:

    array1 = [1, 2, 8, 7, 6]
    array2 = [1, 2, 8, 7, 6]
    ======================
    array1 = [1, 2, 8, 7, 6]
    array2 = [100, 2, 8, 7, 6]
   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5

由结果可以看出,当对复制数组的某个元素进行改变时,并不影响被复制数组对应元素,即对于基本数据类型来说clone()方法实现数组拷贝也属于深拷贝。
截取上面程序的一小段,稍加改变:

    int[] array1 = new int[]{1, 2, 8, 7, 6};
    int[] array2 = new int[array1.length];
    System.out.println("array1 的地址是: " + array1);
    System.out.println("array2 的地址是: " + array2);
    array2 = array1.clone();
    System.out.println("array2 的地址是: " + array2);
   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这段程序的输出结果是:

    array1 的地址是: [I@7852e922
    array2 的地址是: [I@4e25154f
    array2 的地址是: [I@70dea4e
   
   
   
   
  • 1
  • 2
  • 3

可以看到,刚开始通过int[] array2 = new int[array1.length] 语句申请的数组和array2 = array1.clone() 语句产生的数组并不是同一个数组。通过查看clone()方法的源码,对于clone()方法的介绍,总纲是Creates and returns a copy of this object. 意思是“ 创建并返回此对象的副本。”就可以理解为什么array2数组克隆前后指向不同的地址了。
Java一维数组拷贝:clone()方法_第1张图片



同样的,看一下当对象不是基本数据类型,而是引用数据类型时的情况。看以下例子:

class TestArray{
    private int val = 10;
    public void setVal(int val){
        this.val = val;
    }
    public int getVal(){
        return this.val;
    }
}

public class TestDemo {

    /**数组输出方法 */
    public static void printArray(TestArray[] array){
        for(int i = 0;i < array.length;i++){
            System.out.print(array[i].getVal()+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {

        TestArray[] array1 = new TestArray[3];
        // 数组引用赋值
        for (int i = 0; i < array1.length; i++){
            array1[i] = new TestArray();
        }

        TestArray[] array2 = new TestArray[array1.length];
        // 数组clone()方法复制
        array2 = array1.clone();

        printArray(array1);
        printArray(array2);
        System.out.println("==========");

        array2[0].setVal(100);;
        printArray(array1);
        printArray(array2);
    }
}
   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

这段程序的输出结果是:

        10 10 10 
        10 10 10 
        ==========
        100 10 10 
        100 10 10 

   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

由结果可以看出,当对复制数组的某个元素进行改变时,被复制数组对应元素也随之改变,即对于引用数据类型来说clone()方法是浅拷贝。
看一下内存分析:
Java一维数组拷贝:clone()方法_第2张图片
通过内存分析可以很直观的看到,每个数组的元素分别指向同一个内存地址,当通过其中一个数组的某个元素对被指向地址的数值进行更改时,另一个数组相应的元素同样会发生改变。

你可能感兴趣的:(Java基础)