HOWTO · Java

克隆 Java 陣列

本教程將演示 Java 陣列的不同 Clone 方法。

可以通過以下方式將 Java 陣列複製到另一個陣列中。

  • 使用變數賦值:這種技術有其缺點,因為對陣列元素的任何更改都會反映在兩個地方。
  • 建立一個大小相同的陣列並複製每個元素。
  • 對陣列使用克隆技術。克隆方法建立一個大小相似的全新陣列。
  • 利用 System.arraycopy() 技術。arraycopy 是一種從陣列中複製特定部分的方法。

使用 Java 中的 for 迴圈手動複製 Java 陣列

通常,當我們想要複製 ab 等變數時,我們按以下方式執行復制操作:

public class Main {
  public static void main(String[] args) {
    int IArray[] = {24, 45, 56};

    System.out.println("Before assignment the values of IArray[] are:");
    for (int i = 0; i < IArray.length; i++) System.out.print(IArray[i] + " ");

    int CArray[] = new int[IArray.length];

    CArray = IArray;
    CArray[1]++;

    System.out.println("\nElements of IArray[]:");
    for (int i = 0; i < IArray.length; i++) System.out.print(IArray[i] + " ");

    System.out.println("\nElements of CArray[]:");
    for (int i = 0; i < CArray.length; i++) System.out.print(CArray[i] + " ");
  }
}

輸出:

Before assignment the values of IArray[] are:
24 45 56 
Elements of IArray[]:
24 46 56 
Elements of CArray[]:
24 46 56 

當你將相同的過程應用於陣列時,它不會有效。

使用 Arrays.copyOf() 克隆 Java 陣列

Arrays.copyOf() 這個方法有助於 System.arraycopy() 過程的內部使用。雖然它不如陣列複製有效,但它可以複製完整或部分陣列,類似於陣列複製方法。copyOf() 方法是 java.util 包中的一個元素,並且是 Arrays 類的一部分。這種方法背後的基本思想是:

public class Main {
  public static void main(String args[]) {
    int[] OArray = new int[] {11, 12, 13};

    System.out.println("Original Arrays elements are");
    for (int i = 0; i < OArray.length; i++) System.out.print(OArray[i] + " ");

    int[] CArray = Arrays.copyOf(OArray, 5);

    CArray[3] = 22;
    CArray[4] = 66;

    System.out.println("\nNew array after copying and modification are:");
    for (int i = 0; i < copy.length; i++) System.out.print(copy[i] + " ");
  }
}

輸出:

Original Arrays elements are
11 12 13 
New array after copying and modification are
11 12 13 22 66 

這裡,

  • original:將被複制到新建立的陣列中的陣列。
  • newLength:將返回的複製陣列長度。

因此,此方法通過新增 0 來建立新陣列來填充或截斷長度,從而建立作為指定大小的第一個引數提供的陣列的精確副本。這意味著如果複製的陣列的大小大於陣列 0 中的原始大小,則 s 將替換其餘元素。

使用 Arrays.copyOfRange() 克隆 Java 陣列

方法 Arrays.copyOfRange() 專門用於複製陣列的一部分。類似於 toCopyOf() 方法,該方法使用 System.arraycopy() 技術。Arrays.copyOfRange() 過程背後的基本思想可以描述如下:

import java.util.Arrays;

class Main {
  public static void main(String args[]) {
    int IArray[] = {100, 200, 300, 400, 500};

    int[] CArray = Arrays.copyOfRange(IArray, 2, 6);
    System.out.println("Array within the index range : " + Arrays.toString(CArray));

    int[] CArray1 = Arrays.copyOfRange(IArray, 4, IArray.length + 3);

    System.out.println("Array copied within the indexed range: " + Arrays.toString(CArray1));
  }
}

輸出:

Array within the index range : [300, 400, 500, 0]
Array copied within the indexed range: [500, 0, 0, 0]

這裡,

  • original:正在複製的範圍的陣列。
  • from:要複製的陣列的索引。
  • to:要複製的範圍的索引,並且是獨佔的。

使用 Object.clone() 克隆 Java 陣列

Java 陣列在內部實現了一個 Cloneable 介面,因此可以毫不費力地克隆 Java 陣列。可以克隆一維和二維陣列。如果複製一維陣列,它會建立複製值的陣列元素的擴充套件副本。

另一方面,當你複製二維或多維陣列時,會建立元素的小副本,即複製唯一的參考資訊。這個克隆過程是使用提供給陣列的 clone() 方法完成的。

class Main {
  public static void main(String args[]) {
    int NArray[] = {50, 100, 150, 200, 250, 300};

    int CArray[] = NArray.clone();

    System.out.println("Original Num Array are:");
    for (int i = 0; i < NArray.length; i++) {
      System.out.print(NArray[i] + " ");
    }
    System.out.println();

    System.out.println("Cloned Num Array are:");
    for (int i = 0; i < CArray.length; i++) {
      System.out.print(CArray[i] + " ");
    }
    System.out.println("\n");

    System.out.print("NArray == CArray = ");
    System.out.println(NArray == CArray);
  }
}

輸出:

Original Num Array are:
50 100 150 200 250 300 
Cloned Num Array are:
50 100 150 200 250 300 

NArray == CArray = false

使用 System.arraycopy() 克隆 Java 陣列

Java 的 System 類提供了一個名為 ArrayCopy 的選項,它允許你將元素從一個陣列複製到另一個陣列。這種方法最常見的模型是:

class Main {
  public static void main(String[] args) {
    // declaring a source array
    char[] Oarray = {'I', 'L', 'o', 'v', 'e', 'M', 'y', 'C', 'o', 'u', 'n', 't', 'r', 'y'};

    char[] Farray = new char[14];

    System.arraycopy(Oarray, 0, Farray, 0, 14);
    System.out.println("Origional Array Elements are:" + String.valueOf(Oarray));

    System.out.println("Arrays after copying elements are:" + String.valueOf(Farray));
  }
}

輸出:

Origional Array Elements are:ILoveMyCountry
Arrays after copying elements are:ILoveMyCountry

這裡,

  • src_array:從中複製專案的源陣列。
  • src_Pos:源陣列中的位置是複製開始的點。
  • dest_array:目標所在的陣列,元素將被複制到該陣列中。
  • dest_Pos:要複製的專案目標陣列中的起始位置。
  • length:要複製的陣列的長度。