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
,我没有重载任何内容。哦,对不起,我没有意识到一个方法正在调用另一个方法。