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:要复制的数组的长度。