加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何在java中克隆多维数组?

发布时间:2020-12-15 07:37:46 所属栏目:Java 来源:网络整理
导读:参见英文答案 How do I do a deep copy of a 2d array in Java?????????????????????????????????????6个 编辑2:下面是一个基于DuffyMo响应的代码片段,演示了如何使用System.arraycopy克服多维数组克隆的局限性. import java.util.Arrays;public class Rand
参见英文答案 > How do I do a deep copy of a 2d array in Java?????????????????????????????????????6个
编辑2:下面是一个基于DuffyMo响应的代码片段,演示了如何使用System.arraycopy克服多维数组克隆的局限性.

import java.util.Arrays;

public class Randar {
public static int[][] arrayMaster = {{6,1},{10,{1,1}};
private static int[][] arrayChanges = new int[arrayMaster.length][2];

public Randar () {

}
public static void main(String[] args) {
    arrayChanges[0][0] = 0;
    resetArrays(arrayChanges,arrayMaster);
    arrayChanges[0][0] = 0;

    System.out.format("arrayMaster: %s,arrayChanges: %s",Arrays.deepToString(arrayMaster),Arrays.deepToString(arrayChanges));
}


public static void resetArrays(int[][] arrayChanges,int[][] arrayMaster) {
for (int a=0; a< arrayMaster.length; a++) {
System.arraycopy(arrayMaster[a],arrayChanges[a],arrayMaster[a].length);
}
// arrayChanges = arrayMaster.clone(); will NOT work as expected
}
}

[原始问题]
在Java中(完全)克隆多维数组的简单方法是什么?这个程序说明了我的问题.

import java.util.Arrays;

public class Randar {
public static int[][] arrayMaster = {{6,1}};
static private int[][] arrayChanges = arrayMaster;

public static void main(String[] args) {
    arrayChanges[0][0] = 0;
    resetArrays();

    System.out.format("arrayMaster: %s,Arrays.deepToString(arrayChanges));
}


public static void resetArrays() {
arrayChanges = arrayMaster.clone();
}

}

运行上面的代码时,arrayMaster和arrayChanges一样会改变,这与我的意图相反.认为我可以克隆arrayMaster的每个单维数组成员,我试图解决这个问题:

for (int iter = 0; iter < arrayMaster.length; iter++) {
    arrayChanges[iter] = arrayMaster[iter].clone();
    }

但是当我运行由于某种原因而给出NullPointerException的代码时.编写一个循环遍历数组的各个整数值的方法是我唯一的选择吗?

谢谢.

编辑1:这也不能解决问题.

import java.util.Arrays;

public class Randar {
public int[][] arrayMaster = {{6,1}};
private int[][] arrayChanges = arrayMaster.clone();

public Randar () {

}
public static void main(String[] args) {
    Randar Randar1 = new Randar();
    Randar1.arrayChanges[0][0] = 0;
    resetArrays(Randar1.arrayChanges,Randar1.arrayMaster);
    Randar1.arrayChanges[0][0] = 0;

    System.out.format("arrayMaster: %s,Arrays.deepToString(Randar1.arrayMaster),Arrays.deepToString(Randar1.arrayChanges));
}


public static void resetArrays(int[][] arrayChanges,int[][] arrayMaster) {
/*for (int a=0; a< arrayMaster.length; a++) {
System.arraycopy(arrayMaster[a].clone(),arrayMaster[a].length);
} */
arrayChanges = arrayMaster.clone();
}
}

解决方法

When the above code is run,arrayMaster changes as well as arrayChanges,contrary to my intentions.

这条线

static private int[][] arrayChanges = arrayMaster;

是罪魁祸首.此行使arrayChanges和arrayMaster指向同一个对象,因此当您从任一对象访问对象时,可以看到对任一对象的更改.

编辑:每当克隆多维数组的一个维度时会发生什么

作为Eric Lippert explains,数组在概念上是变量列表.如果你只是指定另一个变量来指向同一个数组a la static private int [] [] arrayChanges = arrayMaster;,你根本没有改变变量集.除了arrayChanges之外,您还没有创建任何新变量,因此您没有从操作系统/ JVM获得更多内存,因此您对arrayMaster所做的任何更改都将应用于arrayChanges,反之亦然.

现在让我们来看一个二维数组.在Java中,二维数组是一个变量列表,恰好具有这些变量中的每一个引用一维数组的属性.因此,无论何时克隆二维数组,都会创建一个新的变量列表,每个变量都指向旧变量所指向的相同位置.因此,您已经获得了一些可以安全地编写arrayChanges [0] = new int [10]而不影响arrayMaster,但是一旦开始引用arrayChanges [i] [j],你仍然引用arrayMaster引用的相同的二级数组.你真正想要的是深入复制二维数组的整数是

public static int[][] deepCopyIntMatrix(int[][] input) {
    if (input == null)
        return null;
    int[][] result = new int[input.length][];
    for (int r = 0; r < input.length; r++) {
        result[r] = input[r].clone();
    }
    return result;
}

对于那些可能会在未来看到这个答案的人:是的,最好用T替换int并使方法通用,但为此目的,更具体的深度复制方法更容易解释.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读