- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
为什么这个问题不是可能与 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/
Java 10 的发布带来了新的静态工厂方法,具体来说: static List copyOf(Collection coll) static Set copyOf(Collection co
这个问题已经有答案了: How to make a deep copy of Java ArrayList [duplicate] (2 个回答) 已关闭 4 年前。 我的问题是我需要复制一个列表,但
我只想将“b”、“d”和“e”从 arr1 复制到 arr2,并在添加时动态增加 arr2 的大小。 我尝试添加一个if条件 if(!arr1[i].equals("a") && !arr1[i].
在看别人的关于copyonwritearraylist 这个类的时候,看到有人提出了关于:数组拷贝的方法arrays.copyof() 的问题,如下: 只是复制了引用地址,数组内的对象还是和旧数组一
我有无数带有自定义键和比较器的 map 。我注意到当我使用类似的代码创建 map 时 var map = TreeMap<>( someCustomComparator ); 然后我使用如下代
假设我有以下 map 定义: Map>> map = Maps.newHashMap(); map.put("a", Arrays.asList(Sets.newHashSet(1, 2, 3), S
我有以下代码: private static final ImmutableMultimap namesToAddress; public static List getAddresses(Strin
我有一个程序,如果整数的行为类似于整数堆栈,则使用数组。但是,对于数组,必须有定义数量的元素。当用户调用诸如 push() 之类的方法并超过初始数组数时,我必须将原始数组中的所有内容分配到更新后的数组
关于 Arrays.copyOf 是否会生成深拷贝或浅拷贝,似乎存在很多困惑和不同的意见([1] 和其他来源)。 此测试表明副本很深: String[] sourceArray = new Strin
我正在为类做作业,这需要我创建一个数组并根据用户的意愿添加到其中。这是我到目前为止所拥有的: public void add(Scanner stdIn) { entries = new St
为什么这个问题不是可能与 How Arrays.asList(int[]) can return List? 重复。这个问题并没有真正回答我的具体情况,因为我试图弄清楚我对 Arrays.copyOf
elementData = Arrays.copyOf(elementData, newCapacity); 给出错误: The method copyOf(Object[], int) is und
Java 并发实践的摘录/片段- @Immutable class OneValueCache{ private final BigInteger lastNumber; privat
关于 Arrays.copyOf 是否会产生深拷贝或浅拷贝似乎存在很多困惑和不同意见([1] 和其他来源)。 这个测试表明副本很深: String[] sourceArray = new String
我正在使用 Guava-05-snapshot 和 Sun 的 JDK 1.6执行此代码段的代码会爆炸: List badpasswords = Lists.newArrayList( Passwor
我想知道这个调用是否是线程安全的。例如,如果我有一组 s: Set s = new HashSet<>(); 还有两个线程A和B,线程A修改集合: for (int i = 0; i newS =
我正在尝试创建一个方法,它几乎可以将任何东西作为参数,并返回一个带有一些分隔符的值的串联字符串表示形式。 public static String getConcatenated(char delim
据我了解,我们可以使用 java.util.Arrays.copyOf复制二维数组,但是将其用于防御性复制是否安全(假设元素是不可变的)?例如 void setValues(Integer[][] a
我有一个关于函数“Arrays.copyOf()”的快速问题。 我有一个 IntArray "rows"和一个 Arraylist "listMoves"。我想创建一个行的副本并将其添加到 listM
函数ArrayList.add()工作得非常快。我检查了源代码,发现实现是Arrays.copyOf() private void grow(int minCapacity) { // ove
我是一名优秀的程序员,十分优秀!