Java 我可以使用Arrays.copyOf制作二维数组的防御副本吗?

Java 我可以使用Arrays.copyOf制作二维数组的防御副本吗?,java,Java,据我所知,我们可以使用它来复制二维数组,但将其用于防御复制(假设元素是不可变的)安全吗?例如 Arrays.copyOf在内部使用System.arraycopy,因此不,它不适合制作防御性(深度)拷贝(至少不适合可变类型)。Arrays.copyOf在内部使用System.arraycopy,因此不,它不适合制作防御性(深度)拷贝(至少不适用于可变类型)。不,它不是深度副本。arr看起来像这样(模拟内存地址): 当您使用Arrays.copyOf进行复制时,您将获得一个新的外部数组,因此此.a

据我所知,我们可以使用它来复制二维数组,但将其用于防御复制(假设元素是不可变的)安全吗?例如


Arrays.copyOf
在内部使用
System.arraycopy
,因此不,它不适合制作防御性(深度)拷贝(至少不适合可变类型)。

Arrays.copyOf
在内部使用
System.arraycopy
,因此不,它不适合制作防御性(深度)拷贝(至少不适用于可变类型)。

不,它不是深度副本。
arr
看起来像这样(模拟内存地址):

当您使用
Arrays.copyOf
进行复制时,您将获得一个新的外部数组,因此
此.arr
将:

@0x02 [
  @0x10 [1,2],
  @0x20 [2,3],
  @0x30 [4,5],
]
如果要确保二维阵列不会更改,请执行以下操作:

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

现在这是唯一安全的,因为
Integer
是不可变的。如果它是更复杂的东西,您必须解决如何安全地复制它,这可能涉及更多副本。Java不为您提供免费的深度副本。

不,它不是深度副本。
arr
看起来像这样(模拟内存地址):

当您使用
Arrays.copyOf
进行复制时,您将获得一个新的外部数组,因此
此.arr
将:

@0x02 [
  @0x10 [1,2],
  @0x20 [2,3],
  @0x30 [4,5],
]
如果要确保二维阵列不会更改,请执行以下操作:

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

现在这是唯一安全的,因为
Integer
是不可变的。如果它是更复杂的东西,您必须解决如何安全地复制它,这可能涉及到更多的副本。Java不为您提供免费的深度副本。

它不是深的复制它的浅的副本

它复制指定的数组,截断或填充null(如果需要),使副本具有指定的长度。对于在原始数组和副本中都有效的所有索引,两个数组将包含相同的值

2771    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
2772        T[] copy = ((Object)newType == (Object)Object[].class)
2773            ? (T[]) new Object[newLength]
2774            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
2775        System.arraycopy(original, 0, copy, 0,
2776                         Math.min(original.length, newLength));
2777        return copy;
2778    }

2771公共静态T[]copyOf(U[]original,int newLength,Class它不是深的复制它的浅的复制

它复制指定的数组,截断或填充null(如果需要),使副本具有指定的长度。对于在原始数组和副本中都有效的所有索引,两个数组将包含相同的值

2771    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
2772        T[] copy = ((Object)newType == (Object)Object[].class)
2773            ? (T[]) new Object[newLength]
2774            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
2775        System.arraycopy(original, 0, copy, 0,
2776                         Math.min(original.length, newLength));
2777        return copy;
2778    }

2771公共静态T[]copyOf(U[]原始,int newLength,ClassI将引用重载而不使用
newType
,因此代码段不那么混乱。这不是所有
对象类型的通用解决方案。这没有任何意义。OP甚至没有使用此重载。但这是您的答案。不,您搞错了,它只是对原始
数组的引用。copyOf
,我没有重载任何内容。哦,抱歉,我没有意识到一个方法正在调用另一个方法。我会在不使用
newType
的情况下引用重载,因此代码段不会太混乱。这不是所有
对象类型的通用解决方案。这没有任何意义。OP甚至没有使用此重载。但它是您的回答。不。你弄错了,它只是原始
数组的引用。copyOf
,我没有重载任何内容。哦,对不起,我没有意识到一个方法正在调用另一个方法。