Java拷贝数组的方法

122 阅读2分钟

System.arraycopy()方法

用法

调用该方法时,传入源数组,源数组的起始位置,目标数组,目标数组的起始位置,要复制的元素个数

public static native void arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);

拷贝数值类型

public class SystemArrayCopy {
    public static void main(String[] args) {
        int[] arr1 = new int[4];
        for (int i = 0; i < 4; i++) {
            arr1[i] = i;
        }
        int[] arr2 = new int[4];
        System.arraycopy(arr1, 0, arr2, 0, 3);
        for (int i = 0; i < 4; i++) {
            System.out.println(arr2[i]);
        }
    }
}

上述代码执行结果
0 1 2 0

拷贝引用类型(浅拷贝)

public class SystemArrayCopy {
    public static void main(String[] args) {
        // 拷贝数值类型
        int[] arr1 = new int[4];
        for (int i = 0; i < 4; i++) {
            arr1[i] = i;
        }
        int[] arr2 = new int[4];
        System.arraycopy(arr1, 0, arr2, 0, 3);
        for (int i = 0; i < 4; i++) {
            System.out.println(arr2[i]);
        }

        // 拷贝引用类型
        TestArray[] testArrays1 = new TestArray[4];
        for (int i = 0; i < 4; i++) {
            testArrays1[i] = new TestArray(i);
        }
        TestArray[] testArrays2 = new TestArray[4];
        System.arraycopy(testArrays1,0, testArrays2, 0, 4);
        // 修改副本的值,会影响原数组
        testArrays2[0].setData(1);
        show(testArrays1);
        show(testArrays2);
    }

    public static void show(TestArray[] arrays) {
        for (int i = 0; i < arrays.length; i++) {
            System.out.print(arrays[i].getData() + " ");
        }
        System.out.println();
    }
}

执行结果

image.png

可以看到,副本中元素的地址和源数组元素的地址相同。

Arrays.copyOf()方法

用法

调用该方法时,传入源数组和要复制的数组长度即可。该方法内部会创建1个新的数组作为目标数组,并调用System.arraycopy方法,将源数组复制到目标数组,并返回目标数组。

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;
}

拷贝数值类型

public class ArraysCopyOf {
    public static void main(String[] args) {
        int[] arr1 = new int[4];
        for (int i = 0; i < 4; i++) {
            arr1[i] = i;
        }
        int[] arr2 = Arrays.copyOf(arr1, 3);
        for (int i = 0; i < 4; i++) {
            System.out.println(arr2[i]);
        }
    }
}

执行结果
0 1 2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
	at arrays.ArraysCopyOf.main(ArraysCopyOf.java:13)

拷贝引用类型(浅拷贝)

结果同System.arraycopy()

Object类的clone方法

用法参考文章:Object类的常用方法-clone方法是深拷贝还是浅拷贝

拷贝数值类型

public class ObjectClone {
    public static void main(String[] args) {
        //拷贝基本类型
        int[] arr1 = {1,2,3,4};
        int[] arr2 = arr1.clone();
        System.out.println(Arrays.toString(arr2));
    }
}

拷贝引用类型(浅拷贝)

结果同System.arraycopy()

参考文章

  1. JavaGuide面试题
  2. java数组的四种拷贝方式