私が理解している限りではjava.util.Arrays.copyOf
、2 次元配列をコピーするために使用できますが、それを防御的コピーに使用しても安全ですか (要素が不変であると仮定して)? 例えば
void setValues(Integer[][] arr) {
this.arr = Arrays.copyOf(arr, arr.length);
}
私が理解している限りではjava.util.Arrays.copyOf
、2 次元配列をコピーするために使用できますが、それを防御的コピーに使用しても安全ですか (要素が不変であると仮定して)? 例えば
void setValues(Integer[][] arr) {
this.arr = Arrays.copyOf(arr, arr.length);
}
いいえ、ディープ コピーではありません。 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 は無料のディープ コピーを提供していません。