java中复制数组的几种方式

本文介绍了在Java中三种常见的数组复制方法:直接赋值、使用clone方法及System.arraycopy方法,并对比了它们的特点和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在java语言中,数组是一个比较重要的话题,最近在使用的过程中遇到问题总结了下


  1. 最简单的方式就是直接赋值,A=B;它用于基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么引用同一数组的变量也要发生改变.
    直接用for循环赋值即可。

    代码:
    public class Test {
    	public static void main(String[] args) {
    		int[] A={1,2,3,4,5};
    		System.out.println("数组A的元素如下:");
    		for(int i=0;i<A.length;i++){
    			System.out.print(A[i]+" ");
    		}
    		int[] B=A;
    		System.out.println("\n复制的数组B:");
    		for(int i=0;i<B.length;i++){
    			System.out.print(B[i]+" ");
    		}
    	}
    }

    运行结果:




  2. 第二种方法使用克隆方法(Objectjava.lang.Object.clone()),得到数组的值,而不是引用,不能复制指定元素,灵活性差一点

    代码:

    public class Test {
    	public static void main(String[] args) {
    		int[] A={1,2,3,4,5};
    		System.out.println("数组A的元素如下:");
    		for(int i=0;i<A.length;i++){
    			System.out.print(A[i]+" ");
    		}
    		int[] C;
    		C=(int[])A.clone();
    		System.out.println("\n复制后的数组C是:");
    		for(int i=0;i<C.length;i++){
    			System.out.print(C[i]+" ");
    		}
    	}
    }


    运行结果:





  3. 使用System提供了的静态方法arraycopy(),我个人比较喜欢这种用复制方法,他可以指定复制的长度和位置。
    public static void arraycopy(Object src,
                                 int srcPos,
                                 Object dest,
                                 int destPos,
                                 int length)
    从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。从 src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的编号等于 length 参数。源数组中位置在 srcPossrcPos+length-1 之间的组件被分别复制到目标数组中的 destPosdestPos+length-1 位置。(以上是jdk文档中的解释,我的理解是src复制 的原数组,srcPos是复制原数组的起始位置,dest是需要复制的目标数组,destPos是目标数组的其实位置,length是复制的长度)

    代码:


    import java.util.Scanner;
    
    public class Test {
    	public static void main(String[] args) {
    
    		int[] A = { 1, 2, 3, 4, 5 };
    		System.out.println("数组A是:");
    		for (int i = 0; i < A.length; i++) {
    			System.out.print(A[i] + " ");
    		}
    
    		Scanner scanner = new Scanner(System.in);
    		System.out.println("\n请输入数组B的元素个数b:");
    		int b = scanner.nextInt();
    		scanner.close();
    		int[] B = new int[b];
    		System.arraycopy(A, 0, B, 0, b);
    		System.out.println("赋值后的数组B是:");
    		for (int i = 0; i < B.length; i++) {
    			System.out.print(B[i] + " ");
    		}
    
    	}
    }

    执行结果如下:




    1. 总结:同样的问题会有许多种不同的解法,选择最方便、最适合自己的一种就可以
                        (ps:有问题最好先查文档,文档里写的最可信、直观而又清楚了)









        ### Java复制数组的方法 在Java中,有多种方法可以用来复制数组。每种方法都有其适用场景和特点。 #### 使用 `System.arraycopy` 方法 这是一种高效的方式来进行数组间的元素拷贝。此方法允许指定源数组、目标数组以及要复制的起始位置和长度[^1]。 ```java int[] sourceArray = {1, 2, 3, 4, 5}; int[] destinationArray = new int[sourceArray.length]; System.arraycopy(sourceArray, 0, destinationArray, 0, sourceArray.length); ``` #### 利用 `Arrays.copyOf` 或者 `copyOfRange` 函数 对于想要简化代码或者不需要精确控制复制过程的情况,可以考虑使用这两个静态函数来创建一个新的副本。前者会完全复制整个原数组至新分配的空间;后者则可以根据给定范围进行部分复制[^2]。 ```java // 完整复制 int[] newArray = Arrays.copyOf(sourceArray, sourceArray.length); // 部分复制 (从索引1开始直到第四个元素) int[] subArray = Arrays.copyOfRange(sourceArray, 1, 4); ``` #### 应用克隆机制 (`clone`) 实现深浅度不同的对象复制 当面对的是包含复杂类型的数组(比如自定义类的对象),可能还需要考虑到深层复制的需求。简单调用 `clone()` 可能只实现了浅层复制,在某些情况下这可能是不够安全的做法。因此应当依据实际需求评估是否需要实现更深程度上的复制逻辑[^3]。 ```java Object[] objSource = {"a", "b"}; Object[] clonedObjArr = objSource.clone(); ``` #### 构造器初始化法 如果希望得到一个独立的新实例而不是共享同一内存区域,则可以通过构造新的同类型数组并逐个赋值的方式来完成复制工作。这种方法虽然较为繁琐但是非常直观易懂[^4]。 ```java double[] doubleSrc = {1.1d, 2.2d}; double[] newlyCreatedDoubleArr = new double[doubleSrc.length]; for(int i=0; i<doubleSrc.length ;i++){ newlyCreatedDoubleArr[i]=doubleSrc[i]; } ``` 综上所述,针对不同情况选择合适的技术手段是十分必要的。通常来说,`System.arraycopy`, `Arrays.copyOf/copyOfRange` 和 `clone()` 是最常用也是效率较高的几种方案之一。
        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包
        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

        余额充值