数组的深拷贝和浅拷贝

 

基本数据类型特点:直接存储在栈(stack)中的数据
引用数据类型特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里

引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。

深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。

问题:

以下四种拷贝方式中,哪一种拷贝方式速度最快?

答:System.arraycopy,在源码当中我们可以看到,其被native所修饰,底层由c/c++所实现,执行速度上要快很多。

四种"深拷贝".

import java.util.Arrays;

public class TestDemo {
    //引用.clone();克隆这个引用所指向的对象,这个引用所指向的对象就生成了一个副本,深拷贝!
    public static void main(String[] args) {
        int [] array1={1,2,3,4,5};
        int [] array2=array1.clone();
        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
        System.out.println("------------------------");
        array2[0]=1000;
        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
    }
    // System.arraycopy是深拷贝,因为修改array2的值array1的值不会受到影响。
    public static void main3(String[] args) {
        int [] array1={1,2,3,4,5};
        int [] array2=new int[array1.length];
        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
        System.arraycopy(array1,0,array2,0,array1.length);
        System.out.println("------------------------");
        array2[0]=1000;
        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
    }
    //Arrays.copyOf(array1,array1.length)是深拷贝,共两个参数
    public static void main2(String[] args) {
        int [] array1={1,2,3,4,5};
       int []array2=Arrays.copyOf(array1,array1.length);
    }
//数组的深拷贝,修改array2的值,array1的值不会受到影响
    public static void main1(String[] args) {
        int [] array1={1,2,3,4,5};
        int [] array2=new int[array1.length];
        for(int i=0;i<array1.length;i++){
array2[i]=array1[i];
        }
        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
    }
}

 注意:从本质上来说,这四种拷贝方式都是浅拷贝!!!只不过刚刚的数组当中存放的是简单类型,后面会使用接口cloneable来实现深拷贝

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

little-peter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值