Java中的数组复制五种方法

给定一个数组,我们需要将其元素复制到另一个数组中,天真的用户会想到以下方式,但这是不正确的,如下所示:

// Java 程序说明复制数组的错误方法

// 输入数组
int a[] = { 1, 8, 3 };

// 创建与 a[] 大小相同的数组 b[]
int b[] = new int[a.length];

// 不会将 a[] 的元素复制到 b[],仅使
// b 引用相同的位置
b = a;

输出说明:当我们执行“b = a”时,我们实际上是在分配对数组的引用。

因此,如果我们对一个数组进行任何更改,它也会反映在其他数组中,因为 a 和 b 都引用相同的位置。

// 用一个 Java 程序来演示简单地赋值一个数组引用是不正确的 
public class Test { 
    public static void main(String[] args) 
    { 
        int a[] = { 1, 8, 3 }; 

        
// 创建一个与 a[]  大小相同的数组 b[];
        int b[] = new int[a.length]; 

       
// 不会将 a[] 中的元素复制到 b[], 
      
//只会使 b 引用相同的位置 ;
        b = a; 

        
// 对 b[] 的更改也将反映在 a[] 
     
// 因为 "a "和 "b "指的是同一个位置;
        b[0]++; 

        System.out.println(
"Contents of a[] "); 
        for (int i = 0; i < a.length; i++) 
            System.out.print(a[i] +
" "); 

        System.out.println(
"\n\nContents of b[] "); 
        for (int i = 0; i < b.length; i++) 
            System.out.print(b[i] +
" "); 
    } 
}

输出

a[] 的内容
2 8 3

b[] 的内容
2 8 3

我们已经看到了复制元素时的内部工作以及在解决上面生成的错误后要考虑的边缘情况,因此现在我们可以提出复制数组的正确方法,如下所示:

  1. 迭代给定原始数组的每个元素并一次复制一个元素
  2. 使用clone()方法
  3. 使用 arraycopy() 方法
  4. 使用 Arrays 类的 copyOf() 方法
  5. 使用 Arrays 类的 copyOfRange() 方法

方法一:迭代
迭代给定的原始数组的每个元素并一次复制一个元素。使用此方法,可以保证对 b 的任何修改都不会改变原始数组 a,如下例所示:

// Java 程序演示通过在数组间逐一赋值来复制元素 
// Main class 
public class GFG { 

    
// Main driver method 
    public static void main(String[] args) 
    { 
        
// Input array a[] 
        int a[] = { 1, 8, 3 }; 

        
//创建与 a[]  大小相同的数组 b[];
        int b[] = new int[a.length]; 

        
// 将 a[] 中的元素复制到 b[] ;
        for (int i = 0; i < a.length; i++) 
            b[i] = a[i]; 

        
// 更改 b[] 以验证 
     
// b[] 与 a[]  不同;
        b[0]++; 

        
// Display message only 
        System.out.println(
"Contents of a[] "); 

        for (int i = 0; i < a.length; i++) 
            System.out.print(a[i] +
" "); 

        
// Display message only 
        System.out.println(
"\n\nContents of b[] "); 

        for (int i = 0; i < b.length; i++) 
            System.out.print(b[i] +
" "); 
    } 
}

输出:

a[] 的内容
1 8 3

b[] 的内容
2 8 3

方法2:使用Clone()方法 
在之前的方法中,我们必须迭代整个数组来制作副本,我们可以做得更好吗?是的,我们可以使用Java中的clone方法。 

// Java program to demonstrate Copying of Array 
// using clone() method 

// Main class 
public class GFG { 

    
// Main driver method 
    public static void main(String[] args) 
    { 
        
// Input array a[] 
        int a[] = { 1, 8, 3 }; 

        
// Copying elements of a[] to b[] 
        int b[] = a.clone(); 

        
// Changing b[] to verify that 
        
// b[] is different from a[] 
        b[0]++; 

        
// Display message for better readability 
        System.out.println(
"Contents of a[] "); 

        for (int i = 0; i < a.length; i++) 
            System.out.print(a[i] +
" "); 

        
// Display message for better readability 
        System.out.println(
"\n\nContents of b[] "); 

        for (int i = 0; i < b.length; i++) 
            System.out.print(b[i] +
" "); 
    } 
}

方法3:使用arraycopy()方法
我们还可以使用System.arraycopy()方法。该系统存在于 java.lang 包中。其签名如下: 

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

参数:

  • src表示源数组。
  • srcPos是复制开始的索引。
  • dest表示目标数组
  • destPos是复制的元素放置在目标数组中的索引。
  • length是要复制的子数组的长度。

// Java program to demonstrate array 
// copy using System.arraycopy() 

// Main class 
public class GFG { 

    
// Main driver method 
    public static void main(String[] args) 
    { 
        
// Custom input array 
        int a[] = { 1, 8, 3 }; 

        
// Creating an array b[] of same size as a[] 
        int b[] = new int[a.length]; 

        
// Copying elements of a[] to b[] 
        System.arraycopy(a, 0, b, 0, 3); 

        
// Changing b[] to verify that 
        
// b[] is different from a[] 
        b[0]++; 

        
// Display message only 
        System.out.println(
"Contents of a[] "); 

        for (int i = 0; i < a.length; i++) 
            System.out.print(a[i] +
" "); 

        
// Display message only 
        System.out.println(
"\n\nContents of b[] "); 

        for (int i = 0; i < b.length; i++) 
            System.out.print(b[i] +
" "); 
    } 
}

方法4:使用Arrays类的copyOf()方法 
如果我们想要复制数组的前几个元素或者数组的完整副本,可以使用此方法。
public static int[] copyOf?(int[] original, int newLength) 

参数:

  • 原始数组
  • 要复制的数组的长度。


// Java program to demonstrate array 
// copy using Arrays.copyOf() 

// Importing Arrays class from utility class 
import java.util.Arrays; 

// Main class 
class GFG { 

    
// Main driver method 
    public static void main(String[] args) 
    { 
        
// Custom input array 
        int a[] = { 1, 8, 3 }; 

        
// Create an array b[] of same size as a[] 
        
// Copy elements of a[] to b[] 
        int b[] = Arrays.copyOf(a, 3); 

        
// Change b[] to verify that 
        
// b[] is different from a[] 
        b[0]++; 

        System.out.println(
"Contents of a[] "); 

        
// Iterating over array. a[] 
        for (int i = 0; i < a.length; i++) 
            System.out.print(a[i] +
" "); 

        System.out.println(
"\n\nContents of b[] "); 

        
// Iterating over array b[] 
        for (int i = 0; i < b.length; i++) 
            System.out.print(b[i] +
" "); 
    } 
}

方法5:使用Arrays类的copyOfRange()方法

该方法将指定数组的指定范围复制到一个新数组中。
public static int[] copyOfRange?(int[] original, int from, int to)

参数:

  • 要从中复制范围的原始数组
  • 要复制的范围的初始索引
  • 要复制的范围的目标索引

// Java program to demonstrate array 
// copy using Arrays.copyOfRange() 

// Importing Arrays class from utility package 
import java.util.Arrays; 

// Main class 
class GFG { 

    
// Main driver method 
    public static void main(String[] args) 
    { 
        
// Custom input array 
        int a[] = { 1, 8, 3, 5, 9, 10 }; 

        
// Creating an array b[] and 
        
// copying elements of a[] to b[] 
        int b[] = Arrays.copyOfRange(a, 2, 6); 

        
// Changing b[] to verify that 
        
// b[] is different from a[] 

        
// Iterating over array a[] 
        System.out.println(
"Contents of a[] "); 
        for (int i = 0; i < a.length; i++) 
            System.out.print(a[i] +
" "); 

        
// Iterating over array b[] 
        System.out.println(
"\n\nContents of b[] "); 
        for (int i = 0; i < b.length; i++) 
            System.out.print(b[i] +
" "); 
    } 
}

总结
最后,让我们讨论一下 上述方法的概述: 

  • 简单地分配引用是错误的
  • 可以通过迭代数组并逐一分配元素来复制数组。
  • 我们可以使用clone()或System.arraycopy()来避免元素的迭代
  • clone() 创建一个相同大小的新数组,但System.arraycopy()可用于从源范围复制到目标范围。
  • System.arraycopy() 比 clone() 更快,因为它使用 Java 本机接口
  • 如果要复制数组的前几个元素或数组的完整副本,可以使用 Arrays.copyOf() 方法。
  • Arrays.copyOfRange() 用于复制数组的指定范围。如果起始索引不为0,则可以使用此方法复制部分数组。