1. 程式人生 > >java陣列的四種拷貝方式

java陣列的四種拷貝方式

拷貝陣列方式 深拷貝/淺拷貝 是否產生新的物件 備註
for迴圈拷貝 淺拷貝 拷貝速度最慢
clone拷貝陣列 淺拷貝 會產生新的物件(Object型別的物件)
System.arraycopy 淺拷貝 本地方法(native修飾,c/c++程式碼實現,呼叫執行速度非常快)
Arrays.copyOf 淺拷貝 返回一個數組(拷貝什麼型別返回什麼型別) 底層呼叫System.arraycopy

它們都是淺拷貝,但對於基本資料型別來說可以理解為是深拷貝,對於引用型別來說是淺拷貝,它們拷貝的是引用,和被拷貝的引用指向同一個物件。
在這裡插入圖片描述

四種引用簡單應用程式碼:

public class TestDemo6 {
    public static void main(String[] args) {
        for_copy();
        clone_copy();
        arraycopy_copy();
        ArrayscopyOf_copy();


    }

    /**
     * for迴圈拷貝陣列
     */
    public static void for_copy() {
        //一維陣列的拷貝
        int[] array1={1,2,3,4,5,6,7};
        int[] array2=new int[array1.length];

        for(int i = 0;i < array1.length;i++){
            array2[i] = array1[i];
        }
        System.out.println(Arrays.toString(array2));

        //二維陣列的拷貝
        int[][] array3= {{1,2,3},{4,5,6}};
        int[][] array4 = new int[2][3];

        for(int i = 0;i < array3.length;i++){
            for(int j = 0;j < array3[i].length;j++){
                array4[i][j] = array3[i][j];
            }
        }
        System.out.println(Arrays.deepToString(array4));
    }




    /**
     * clone拷貝陣列
     */
    public static void clone_copy() {
        //一維陣列的拷貝
        int[] array1={1,2,3,5,9,8,7};
        int[] array2=new int[array1.length];
        array2=array1.clone();
        System.out.println(Arrays.toString(array2));


        //二維陣列的拷貝
        int[][] array3={{1,2,3,4},{5,6,7}};
        int[][] array4=new int[2][];

        for(int i = 0;i < array3.length;i++){
            array4[i] = array3[i].clone();
        }
        for(int i=0;i<array3.length;i++){
            System.out.print(Arrays.toString(array4[i]));
        }

    }

    /**
     * System.arraycopy拷貝陣列
     */
    public static void arraycopy_copy() {
        //一維陣列的拷貝
        int[] array = {1,2,3,4,5};
        int[] array2 = new int[array.length];
        System.arraycopy(array, 0, array2, 0, array.length);//(被複制的陣列,從幾號下標開始複製,複製到哪個陣列,複製到新陣列第幾號下標,複製長度)
        System.out.println(Arrays.toString(array2));
        
        //二維陣列的拷貝
        int[][] array1={{1,2,3,5,9},{2,3,36,5,7}};
        int[][] array3=new int[2][5];
        for(int i=0;i<array1.length;i++){
            System.arraycopy(array1[i], 0, array3[i], 0, array1[i].length);
        }
        System.out.println(Arrays.deepToString(array3));


    }

    /**
     * Arrays.copyOf拷貝陣列
     */
    public static void ArrayscopyOf_copy() {
        //一維陣列的拷貝
        int[] array=new int[4];
        System.out.println(Arrays.toString(array));
        int[] array1 = new int[4];
        array1 = Arrays.copyOf(array,array.length);//將陣列array拷貝到陣列brr,拷貝長度為array.length
        System.out.println(Arrays.toString(array1));
        
        //一維陣列的拷貝
        int[][] array2={{1,2,3,4},{2,6,7,5}};
        int[][] array3=new int[2][4];
        array3=Arrays.copyOf(array2, array2.length);
        System.out.println(Arrays.deepToString(array3));
    }

}