引用类型的二维数组的拷贝

前文看了基本类型的二维数组的拷贝方式,本文我们来看看引用类型的二维数组的拷贝是怎样的。



1.for循环拷贝

看以下例子:

class Test{
    private int data = 10;
    public void setData(int data){
        this.data = data;
    }
    public int getData(){
        return data;
    }

}

public class Demo {

    public static void printArray(Test[][] array){
        for(int i = 0;i < array.length;i++){
            for(int j = 0;j < array[i].length;j++){
                System.out.print(array[i][j].getData()+" ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {

        Test[][] data1 = new Test[2][3];
        for(int i = 0;i < data1.length;i++){
            for(int j = 0;j < data1[i].length;j++){
                data1[i][j] = new Test();
            }
        }

        Test[][] data2 = new Test[2][3];
         System.out.println(data2);
        System.out.println(data2[0]);
         System.out.println("==========");

        for(int i = 0;i < data1.length;i++){
            for(int j = 0;j < data1[i].length;j++){
                data2[i][j] = data1[i][j];
            }
        }
        System.out.println(data1);
        System.out.println(data2);
        System.out.println("==========");
        System.out.println(data1[0]);
        System.out.println(data2[0]);

        printArray(data1);
        System.out.println("==========");
        printArray(data2);

        System.out.println("==========");

        data2[0][0].setData(1000);
        printArray(data1);
        System.out.println("==========");
        printArray(data2);

    }
}

以上程序的输出结果是:

        [[Lcom.data.Test;@4e25154f
        [Lcom.data.Test;@70dea4e
        ==========
        [[Lcom.data.Test;@5c647e05
        [[Lcom.data.Test;@4e25154f
        ==========
        [Lcom.data.Test;@7852e922
        [Lcom.data.Test;@70dea4e
        10 10 10 
        10 10 10 
        ==========
        1000 10 10 
        10 10 10 
        ==========
        1000 10 10 
        10 10 10 

内存分析:

内存分析


2.clone()方法拷贝方式1

看以下例子:

class Test{

    private int data = 10;
    public void setData(int data){
        this.data = data;
    }
    public int getData(){
        return data;
    }

}

public class Demo {

    public static void printArray(Test[][] array){
        for(int i = 0;i < array.length;i++){
            for(int j = 0;j < array[i].length;j++){
                System.out.print(array[i][j].getData()+" ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        Test[][] data1 = new Test[2][3];
        for(int i = 0;i < data1.length;i++){
            for(int j = 0;j < data1[i].length;j++){
                data1[i][j] = new Test();
            }
        }

        Test[][] data2 = new Test[2][3];
        System.out.println(data2);
        System.out.println(data2[0]);
        System.out.println("==========");

        for(int i = 0;i < data1.length;i++){   
            data2[i] = data1[i].clone();
        }

        System.out.println(data1);
        System.out.println(data2);
        System.out.println("==========");
        System.out.println(data2[0]);
        System.out.println(data2[0]);

        System.out.println("==========");

        printArray(data1);
        System.out.println("==========");
        printArray(data2);

        System.out.println("==========");

        data2[0][0].setData(1000);
        printArray(data1);
        System.out.println("==========");
        printArray(data2);

    }
}

运行结果是:

        [[Lcom.data.Test;@7852e922
        [Lcom.data.Test;@4e25154f
        ==========
        [[Lcom.data.Test;@70dea4e
        [[Lcom.data.Test;@7852e922
        ==========
        [Lcom.data.Test;@5c647e05
        [Lcom.data.Test;@33909752
        ==========
        10 10 10 
        10 10 10 
        ==========
        10 10 10 
        10 10 10 
        ==========
        1000 10 10 
        10 10 10 
        ==========
        1000 10 10 
        10 10 10 

看一下内存分析:
内存分析



3.clone()方法拷贝方式2

将上面的克隆语句:

        for(int i = 0;i < data1.length;i++){   
            data2[i] = data1[i].clone();
        }

换成下面的语句:

        data2 = data1.clone();

结果是:

        [[Lcom.data.Test;@7852e922
        [Lcom.data.Test;@4e25154f
        ==========
        [[Lcom.data.Test;@70dea4e
        [[Lcom.data.Test;@5c647e05
        ==========
        [Lcom.data.Test;@33909752
        [Lcom.data.Test;@33909752
        ==========
        10 10 10 
        10 10 10 
        ==========
        10 10 10 
        10 10 10 
        ==========
        1000 10 10 
        10 10 10 
        ==========
        1000 10 10 
        10 10 10 

看一下内存分析:
内存分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值