【问题标题】:array copy by value fails (with clone() or arraycopy()) (Android, Java)按值复制数组失败(使用 clone() 或 arraycopy())(Android、Java)
【发布时间】:2013-01-19 16:00:33
【问题描述】:

为了制作包含值副本而不是通过引用的数组的副本,我执行以下操作:

int[][][] copy = {{{0}},{{0}},{{0,0}},{{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0}},{{0}},{{0,0}}};
System.arraycopy(spelerSpel, 0, copy, 0, spelerSpel.length);

然后在副本中更改一个值:

copy[SPELER_NUMMER][0][0] = baanSpelerNummer;

这会导致 ORIGINAL (spelerSpel) 数组保持相同的更改值,例如:

{{{4}},{{0}},{{0,0}},{{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0}},{{0}},{{0,0}}};

作为副本。我也试过 .clone(),同样的结果。我做错了什么?

顺便说一下,我的目标是 Android API 8,它不支持 Arrays.copyOf()。

【问题讨论】:

  • 我不确定,但从文档来看,它听起来不像 arraycopy 是递归的——它会复制最外层的数组,但不会递归地复制多维数组的内部数组。你可能需要自己动手。

标签: android clone arrays


【解决方案1】:

System.arraycopy() 不支持深拷贝,但它在简单数组的性能方面做得很好。

你可以用它和一些额外的循环来创建你自己的多维arraycopy3d()

public int[][][] arraycopy3d(int[][][] array) {

     int[][][] copy = new int[array.length][][];

     for (int i = 0; i < array.length; i++) {
         copy[i] = new int[array[i].length][];
         for (int j = 0; j < array[i].length; j++) {
             copy[i][j] = new int[array[i][j].length];
             System.arraycopy(array[i][j], 0, copy[i][j], 0, array[i][j].length);
        }
    }

    return copy;
} 

【讨论】:

  • 实际上,结果(多维)副本是(正确地)由arraycopy(以及clone()产生的。但是问题是它原来是通过引用而不是按值复制正如我所料。
  • 复制构造函数 (link) 可以提供帮助吗?在这种情况下如何?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2012-04-25
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 2020-09-18
相关资源
最近更新 更多