【问题标题】:Copy 2D array within object by reference通过引用复制对象内的二维数组
【发布时间】:2026-02-14 22:00:01
【问题描述】:

Object1.java:

public class Object1 {
    public double[][] var1;
    ...
}

Object2.java:

public class Object2 {
    public double[][] var2;
    ...
}

我想通过引用(浅拷贝)将 Object2.var2 复制到 Object1.var1。这是我正在尝试的方法,但不起作用:

 Object1 object1 = new Object1();
 object1.var1 = new double[2][];
 System.arraycopy(object2.var2, 0, object1.var1, 0, object2.var2.length);

有人知道我哪里出错了吗?我收到java.lang.NullPointerException 编译错误。请注意,object2.var2 填充了数据。

更新 1:

注意 object2.var2 是一个 Nx2 矩阵,如下所示:

object2.var2[0][0]=1.232
object2.var2[0][1]=23.233
object2.var2[1][0]=3.23
object2.var2[1][1]=32.12
...
object2.var2[N][0]=3.23
object2.var2[N][1]=32.12

当我尝试以下操作时,我还会看到 java.lang.NullPointerException

object1.var1=new double[object2.var2.length][2];
object1.var1=object2.var2;

【问题讨论】:

  • 如果你想实际复制引用,你应该使用public List<List<Double>> var = new ArrayList<ArrayList<Double>>(); 否则这是*.com/questions/10269018/…之类的复制品
  • "引用复制" != "浅拷贝"
  • 好的,通过引用复制,然后。

标签: java java-7


【解决方案1】:

即使在原始矩阵中,您也分配了数组的一维而不是其他维度!

双变量1=新双[2][]; //还不够

将矩阵视为数组数组——您分配了数组数组,但没有分配内部数组本身。如果您希望 2x3 矩阵的第二维为 3,您需要:

for(int i=0 ; i &LT var1.length; i ++) var1[i]=新双[3]

现在您的矩阵已分配。副本会以几乎相同的方式进行。

要将 var1 中的任意矩阵复制到 var2,您可能需要:

var2=新双[var1.length][]; for(int i=0 ; i &LT var1.length; i ++) { var2[i]=新双[var1[i]]; System.arraycopy(object2.var2[i], 0, object1.var1[i], 0, object2.var2[i].length); }

我没有做这么多,但我认为这很准确。

也就是说,通常有更好的方法。如果您要大量使用矩阵,您可能需要查看一些免费的外部库。

【讨论】:

  • 这描述了一个深拷贝。 OP 想要一个浅拷贝——尽管这很令人困惑,因为他的代码是深度拷贝的一半。
  • 深拷贝将复制矩阵中的每个对象。制作矩阵的浅拷贝是他要求的,而不是指向矩阵的变量的浅拷贝。
  • 正在复制矩阵中的每个对象。该矩阵包含原始doubles ...您在此处描述的是100%正确的深拷贝。 :)
  • 啊,我想你是对的。如果它是一个 Double 它会有所不同,但由于 Java 内联双打......嗯。无论如何,我认为这就是他的榜样所追求的。
【解决方案2】:

你说你想要一个浅拷贝,但看起来你正在尝试一个深拷贝。对于浅拷贝,你所要做的就是拷贝引用;无需数组分配或复制:

object1.var1 = object2.var2;

例子:

public class Example {
    public static final void main (String[] args) {
        double[][] d = new double[10][10];
        double[][] e = d;    
        d[3][3] = 1.234;
        System.out.println(e[3][3]);
    }
}

输出是1.234

【讨论】:

【解决方案3】:
    Object2 object2 = new Object2();    
    // you need to iniialize ur object2.var2 first
    object2.var2 = new double[][]{ {1.232, 23.233},{3.23,32.12},{3.23,32.12}};
    //or 
    object2.var2 = new double[3][2];
    object2.var2[0][0]=1.232;
    object2.var2[0][1]=23.233;
    object2.var2[1][0]=3.23;
    object2.var2[1][1]=32.12;
    object2.var2[2][0]=3.23;
    object2.var2[2][1]=32.12;

    System.out.println(object2.var2);
    Object1 object1 = new Object1();
    object1.var1= new double[object2.var2.length][2];
    System.out.println(object1.var1);
    System.arraycopy(object2.var2, 0, object1.var1, 0, object2.var2.length);

【讨论】:

  • 感谢您的详细回答。我终于用你的例子让它工作了。
  • 这不是你想要的(或者至少不是你所说的你想要的)。这只是浅拷贝的一半。它创建一个新数组来保存行引用,然后存储与原始数组相同的行引用。这样,修改一个数组中的单元格将反映在另一个数组中,尽管替换整行 (object1.var1[n] = new double[]) 不会影响另一行。这是一个不寻常的案例;你确定这是你想要的吗?