中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java數組的拷貝方式有哪些

發布時間:2022-02-24 09:35:35 來源:億速云 閱讀:172 作者:小新 欄目:開發技術

這篇文章主要介紹了Java數組的拷貝方式有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    深拷貝與淺拷貝的區別

    假設現在有原數組A以及拷貝后的數組B,若是改變A中的某一個值,B數組隨之相應的發生變化的拷貝方式稱為淺拷貝,反之B數組不受影響,則稱為深拷貝;
    簡單總結一下兩者的概念:

    深拷貝:拷貝后,修改原數組,不會影響到新數組;

    淺拷貝:拷貝后,修改原數組,新數組也會相應的發生改變;

    1. for循環進行拷貝

    拷貝數值類型

    當數組中存放的元素為基本數據類型時,此時發生的是深拷貝;

    //1. for循環拷貝  (拷貝數值類型) ---深拷貝
        public static void main(String[] args) {
            int[] A = {1,2,3,4,5};
            int[] B = new int[A.length];
            for (int i = 0; i < A.length; i++) {
                B[i] = A[i];
            }
            System.out.println("A : " + Arrays.toString(A));  //A : [1, 2, 3, 4, 5]
            System.out.println("B : " + Arrays.toString(B));  //B : [1, 2, 3, 4, 5]
            System.out.println("===========修改后===========");
            A[0] = 100;
            System.out.println("A : " + Arrays.toString(A));  //A : [100, 2, 3, 4, 5]
            System.out.println("B : " + Arrays.toString(B));  //B : [1, 2, 3, 4, 5]
        }
        //打印對象數組的方法
        public static void show(Num[] arrays) {
            for (int i = 0; i < arrays.length; i++) {
                System.out.print(arrays[i].getVal() + " ");
            }
            System.out.println();
        }
    class Num{
        public int val = 0;
    
        public Num(int val) {
            this.val = val;
        }
    
        public int getVal() {
            return val;
        }
    
        public void setVal(int val) {
            this.val = val;
        }
    }

    拷貝引用類型

    當數組中存放的元素為引用數據類型時,此時發生的是淺拷貝;

    //1. for循環拷貝  (拷貝引用數據類型) ---淺拷貝
        public static void main(String[] args) {
            Num[] A = new Num[4];
            A[0] = new Num(1);
            A[1] = new Num(2);
            A[2] = new Num(3);
            A[3] = new Num(4);
            Num[] B = new Num[4];
            for (int i = 0; i < A.length; i++) {
                B[i] = A[i];
            }
            show(A);  //1 2 3 4 
            show(B);  //1 2 3 4 
            System.out.println("===========修改后===========");
            A[0].setVal(100);
            show(A);  //100 2 3 4
            show(B);  //100 2 3 4
        }

    2. copyof / copyOfRange

    拷貝數值類型

    當數組中存放的元素為基本數據類型時,此時發生的是深拷貝;

    Arrays.copy(原數組,自定義新數組長度);

    Arrays.copyOfRange(原數組,from,to);

    注意拷貝截取的范圍是左閉右開的[from,to)

    //2. copy / copyOfRange  (拷貝數值類型) ---深拷貝
        public static void main(String[] args) {
            int[] A = {1,2,3,4,5};
            int[] B = Arrays.copyOf(A,A.length);
            int[] C = Arrays.copyOfRange(A,1,3);
            System.out.println("A : " + Arrays.toString(A));  //A : [1, 2, 3, 4, 5]
            System.out.println("B : " + Arrays.toString(B));  //B : [1, 2, 3, 4, 5]
            System.out.println("C : " + Arrays.toString(C));  //C : [2, 3]
            System.out.println("===========修改后===========");
            A[0] = 100;
            System.out.println("A : " + Arrays.toString(A));  //A : [100, 2, 3, 4, 5]
            System.out.println("B : " + Arrays.toString(B));  //B : [1, 2, 3, 4, 5]
            System.out.println("C : " + Arrays.toString(C));  //C : [2, 3]
        }

    拷貝引用類型

    當數組中存放的元素為類的對象時,此時發生的是淺拷貝;

    //2. copy / copyOfRange  (拷貝引用類型) ---淺拷貝
        public static void main(String[] args) {
            Num[] A = new Num[4];
            A[0] = new Num(1);
            A[1] = new Num(2);
            A[2] = new Num(3);
            A[3] = new Num(4);
            Num[] B = Arrays.copyOf(A,A.length);
            show(A);  //1 2 3 4
            show(B);  //1 2 3 4
            System.out.println("===========修改后===========");
            A[0].setVal(100);
            show(A);  //100 2 3 4
            show(B);  //100 2 3 4
        }
    class Num{
        public int val = 0;
    
        public Num(int val) {
            this.val = val;
        }
    
        public int getVal() {
            return val;
        }
    
        public void setVal(int val) {
            this.val = val;
        }
    }

    3. arraycopy

    拷貝數值類型

    當數組中存放的元素為基本數據類型時,此時發生的是深拷貝;

    System.arraycopy(src, srcPos dest, destPos, length);

    其中各個參數分別表示 如下:

    • src :源數組

    • srcPos:源數組要復制的起始位置

    • dest:目標數組

    • destPos:目標數組復制的起始位置

    • length:復制的長度

    所以srcPos和destPos都為0,且length為源數組長度時,表示完完整整的拷貝過來了;那么截取范圍拷貝也舉個例子,下面的代碼中srcPos = 1,destPos = 2,length = 2,表示從A數組下標為1的位置開始截取2個元素,放到B數組中下標為2的位置作為起始位置,再對比一下輸出看看。

    //3. arraycopy  (拷貝數值類型) ---深拷貝
        public static void main(String[] args) {
            int[] A = {1,2,3,4,5};
            int[] B = new int[A.length];
            //System.arraycopy(A,0,B,0,A.length);
            System.arraycopy(A,1,B,2,2);
            System.out.println("A : " + Arrays.toString(A));  //A : [1, 2, 3, 4, 5]
            System.out.println("B : " + Arrays.toString(B));  //B : [0, 0, 2, 3, 0]
            System.out.println("===========修改后===========");
            A[0] = 100;
            System.out.println("A : " + Arrays.toString(A));  //A : [100, 2, 3, 4, 5]
            System.out.println("B : " + Arrays.toString(B));  //B : [0, 0, 2, 3, 0]
        }

    拷貝引用類型

    當數組中存放的元素為類的對象時,此時發生的是淺拷貝;

    //3. arraycopy  (拷貝引用類型) ---淺拷貝
        public static void main(String[] args) {
            Num[] A = new Num[4];
            A[0] = new Num(1);
            A[1] = new Num(2);
            A[2] = new Num(3);
            A[3] = new Num(4);
            Num[] B = new Num[4];
            System.arraycopy(A,0,B,0,A.length);
            show(A);  //1 2 3 4
            show(B);  //1 2 3 4
            System.out.println("===========修改后===========");
            A[0].setVal(100);
            show(A);  //100 2 3 4
            show(B);  //100 2 3 4
        }
    class Num{
        public int val = 0;
    
        public Num(int val) {
            this.val = val;
        }
    
        public int getVal() {
            return val;
        }
    
        public void setVal(int val) {
            this.val = val;
        }
    }

    4. clone

    拷貝數值類型

    當數組中存放的元素為基本數據類型時,此時發生的是深拷貝;

    //4. clone  (拷貝數值類型) ---深拷貝
        public static void main(String[] args) {
            int[] A = {1,2,3,4,5};
            int[] B = A.clone();
            System.out.println("A : " + Arrays.toString(A));  //A : [1, 2, 3, 4, 5]
            System.out.println("B : " + Arrays.toString(B));  //B : [1, 2, 3, 4, 5]
            System.out.println("===========修改后===========");
            A[0] = 100;
            System.out.println("A : " + Arrays.toString(A));  //A : [100, 2, 3, 4, 5]
            System.out.println("B : " + Arrays.toString(B));  //B : [1, 2, 3, 4, 5]
        }

    拷貝引用類型

    當數組中存放的元素為類的對象時,此時發生的是淺拷貝;

    //4. clone  (拷貝引用類型) ---淺拷貝
        public static void main(String[] args) {
            Num[] A = new Num[4];
            A[0] = new Num(1);
            A[1] = new Num(2);
            A[2] = new Num(3);
            A[3] = new Num(4);
            Num[] B = A.clone();
            show(A);  //1 2 3 4
            show(B);  //1 2 3 4
            System.out.println("===========修改后===========");
            A[0].setVal(100);
            show(A);  //100 2 3 4
            show(B);  //100 2 3 4
        }

    5. 總結

    拷貝方式數值類型引用類型推薦使用
    for循環深拷貝淺拷貝 
    copyof深拷貝淺拷貝&radic;
    arraycopy深拷貝淺拷貝&radic;
    clone深拷貝淺拷貝 

    由于arraycopy底層是C++寫的,所以速度快,更多的是使用這個方法。

    注意:本文中所有的引用數據類型都是以類的對象為例,使用的是對象數組,我們也知道引用類型包括類,接口,字符串等等。但是需要注意字符串是新的變量,所以如果是連個字符串數組進行拷貝,即使他們是引用類型,但是每次都會創建了一個字符串數組對象, 因此, 修改原數組, 不會影響到新數組,即深拷貝。

    感謝你能夠認真閱讀完這篇文章,希望小編分享的“Java數組的拷貝方式有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    永丰县| 建平县| 开封市| 台湾省| 昭觉县| 大丰市| 鸡东县| 北票市| 邛崃市| 泰和县| 仲巴县| 天峨县| 富蕴县| 南平市| 涞源县| 株洲县| 梅河口市| 紫金县| 五家渠市| 木兰县| 通许县| 桑日县| 佛教| 武义县| 渑池县| 仁化县| 新营市| 岫岩| 堆龙德庆县| 南宫市| 大厂| 龙川县| 淄博市| 浠水县| 七台河市| 鄂伦春自治旗| 三明市| 长顺县| 永泰县| 城固县| 无为县|