gpt4 book ai didi

java - Arrays.copyOf 中的看似差异

转载 作者:太空宇宙 更新时间:2023-11-04 12:04:57 25 4
gpt4 key购买 nike

为什么这个问题不是可能与 How Arrays.asList(int[]) can return List<int[]>? 重复。这个问题并没有真正回答我的具体情况,因为我试图弄清楚我对 Arrays.copyOf 的使用是否存在差异。

情况 1: 假定数组的深拷贝

    // Creating a integer array, populating its values
int[] src = new int[2];
src[0] = 2;
src[1] = 3;
// Create a copy of the array
int [] dst= Arrays.copyOf(src,src.length);
Assert.assertArrayEquals(src, dst);
// Now change one element in the original
dst[0] = 4;
// Following line throws an exception, (which is expected) if the copy is a deep one
Assert.assertArrayEquals(src, dst);

案例 2:事情似乎很奇怪:我试图使用下面的方法(从书中逐字提取)来创建输入数组参数副本的不可变 ListView 。这样,如果输入数组发生更改,返回列表的内容不会更改。

    @SafeVarargs
public static <T> List<T> list(T... t) {
return Collections.unmodifiableList(new ArrayList<>(Arrays.asList(Arrays.copyOf(t, t.length))));
}


int[] arr2 = new int[2];
arr2[0] = 2;
arr2[1] = 3;
// Create an unmodifiable list
List<int[]> list2 = list(arr2);

list2.stream().forEach(s -> System.out.println(Arrays.toString(s)));
// Prints [2, 3] as expected

arr2[0] = 3;

list2.stream().forEach(s -> System.out.println(Arrays.toString(s)));
// Prints [3, 3] which doesn't make sense to me... I would have thought it would print [2, 3] and not be affected by my changing the value of the element.

我看到的矛盾是,在一种情况(情况 1)中,Arrays.copyOf 似乎是深拷贝,而在另一种情况(情况 2)中,它似乎是浅拷贝。对原始数组的更改似乎已写入列表,即使我在创建不可修改的列表时复制了该数组。

有人可以帮助我解决这个差异吗?

最佳答案

首先,您的列表方法执行了不必要的步骤,您不需要 copyOf 操作,因此这里是:

@SafeVarargs
public static <T> List<T> list(T... t) {
return Collections.unmodifiableList(
new ArrayList<>(Arrays.asList(t))
);
}

ArrayList 构造函数已经复制了传入的列表,因此您在那里是安全的。

接下来,当您使用 int[] 调用 list() 方法时,该数组将被视为 int[] 类型的单个元素,因为 T... 的类型删除是 Object...,而 int 是原始类型。如果不更改参数类型或执行 instanceOf 检查并在方法内手动执行复制,则无法使您的方法在列表内进行深层复制。我想说最明智的做法可能是将 Arrays.copyOf() 调用移到方法之外:

List<int[]> list2 = list(Arrays.copyOf(arr2));

关于java - Arrays.copyOf 中的看似差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40468779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com