java源码分析~一文看懂java数组复制(原始方法,Arrays.copyOf(),System.arraycopy(),Object.clone(),遍历)

数组拷贝的四种方式

声明:本文是源码是来自基于jdk1.8,数据采用基本类型

  • 源码分析

  1. Arrays.copyOf()
	/*此方法是一个静态方法,所以可以通过Arrays类名直接调用
	*数组拷贝时先创建一个的数组,再调用System.arraycopy()方法。
	*参数解析:original:要复制的数组;newLength:返回副本的长度若该值比要复制的数组original的长度更大,则将多余的结果设置为0或false
	*/
    public static int[] copyOf(int[] original, int newLength) {
        int[] copy = new int[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }
  • System.arraycopy()
	/*此方法是一个静态方法,并且有native修饰,表明为本地方法,执行效率高
	*参数解析:
	*第一个参数src:要复制的数组
	*第二个参数srcPos:要复制的数组中的起始位置
	*第三个参数dest:副本数组。预先创建好的数组
	*第五个参数destPos:副本数组中的起始位置
	*第六个参数length:要复制的数组元素的数量
	*/
    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);
  • 打印比较

1.直接赋值
        int []array={1,2,3};
        int []array1=new int[3];
        array1=array;
        System.out.println(Arrays.toString(array));  //[1, 2, 3]
        System.out.println(Arrays.toString(array1));  //[1, 2, 3]
        System.out.println(array==array1);  //true
2.copyOf()
        int []array2={1,2,3};
        int []array3=new int[3];
        array3=Arrays.copyOf(array2,3);  //底层创建一个新的数组,再使用System.arraycopy()进行复制
        System.out.println(Arrays.toString(array2)); //[1, 2, 3]
        System.out.println(Arrays.toString(array3)); //[1, 2, 3]
        System.out.println(array2.toString()); //[I@74a14482
        System.out.println(array3.toString()); //[I@1540e19d
        System.out.println(array2 == array3);  // false
3.arraycopy()
        int []array4={1,2,3};
        int []array5=new int[3];
                        //"源数组" “源数组起始位置” ”目标元素““目标数据中的起始位置”,"要复制的数组元素的数量"
        System.arraycopy(array4,0,array5,0,1);   //
        System.out.println(Arrays.toString(array4)); //[1, 2, 3]
        System.out.println(Arrays.toString(array5)); //[1, 0, 0]
        System.out.println(array4.toString()); //[I@74a14482
        System.out.println(array5.toString()); //[I@1540e19d
        System.out.println(array4==array5);  //false
4.clone()
        int[] array6={1,2,3,4};
        int[] array7=new int[4];
        array7=array6.clone(); //基本类型的一维数组是深拷贝
        System.out.println(Arrays.toString(array6)); //[1, 2, 3, 4]
        System.out.println(Arrays.toString(array7)); //[1, 2, 3, 4]
        System.out.println(array6.toString()); //[I@7f31245a
        System.out.println(array7.toString()); //[I@6d6f6e28
        System.out.println(array6==array7); //false
5.遍历
        int[] array8={1,2,3};
        int[] array9=new int[array8.length];
        int length=array8.length;
        for (int i=0;i<length;i++){
            array9[i]=array8[i];
        }
        System.out.println(Arrays.toString(array8)); //[1, 2, 3]
        System.out.println(Arrays.toString(array9)); //[1, 2, 3]
        System.out.println(array8.toString()); //[I@135fbaa4
        System.out.println(array9.toString()); //[I@45ee12a7
        System.out.println(array8==array9); //false

总结

  1. ArrayList源码中很好的展示了什么时候使用Arrays.copyOf()和System.arraycopy()的实例,有兴趣的可以自行查看。
  2. 关于数组的复制方法和注意点还有很多,后续将单独写clone()、引用类型数据的复制、Arrays类、System类,效率问题等。
  3. 写在最后,由于水平有限,写的不对的地方还请评论指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值