0

私が理解している限りではjava.util.Arrays.copyOf、2 次元配列をコピーするために使用できますが、それを防御的コピーに使用しても安全ですか (要素が不変であると仮定して)? 例えば

void setValues(Integer[][] arr) {
    this.arr = Arrays.copyOf(arr, arr.length);
}
4

3 に答える 3

1

いいえ、ディープ コピーではありません。 arr次のようになります(メモリアドレスのモックアップ):

@0x01 [
  @0x10 [1,2],
  @0x20 [2,3],
  @0x30 [4,5],
]

でコピーを作成するとArrays.copyOf、新しい外部配列が取得されるため、次のようthis.arrになります。

@0x02 [
  @0x10 [1,2],
  @0x20 [2,3],
  @0x30 [4,5],
]

2 次元配列が変更されないようにしたい場合は、次のようにします。

this.arr = new Integer[arr.length][];
for (int i = 0; i < arr.length; i++) {
    this.arr[i] = Arrays.copyOf(arr[i], arr[i].length);
}

が不変であるため、これは安全ですInteger。より複雑なものである場合は、それを安全にコピーする方法を考え出す必要があります。これには、より多くのコピーが必要になる可能性があります。Java は無料のディープ コピーを提供していません。

于 2013-04-12T04:36:44.543 に答える