如果我更改传递给 Arrays.asList(array) 的数组,那么列表的值也会发生变化。

4
我看过Arrays.class代码,但不明白为什么对数组所做的更改会反映到ArrayList上,即使下面的代码返回新的ArrayList。
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

示例代码:

    public class Test {
    public static void main(String[] args) {
        Integer [] array = {1,2,3,4,5};
        List<Integer> list = new ArrayList<>();
        list = Arrays.asList(array);
        System.out.println("List created from array:  " + list);
        array[0] = 100;
        System.out.println("List after changing array:" + list);
    }
}

输出:

由数组创建的列表:[1, 2, 3, 4, 5]

更改数组后的列表:[100, 2, 3, 4, 5]


1
根据JavaDoc:返回由指定数组支持的固定大小列表。(返回的列表的更改将“写入”到数组中。)该方法作为基于数组和基于集合的API之间的桥梁,与Collection.toArray()结合使用。返回的列表是可序列化的并且实现了RandomAccess。 - M. le Rutte
3
请注意,此处提到的ArrayListjava.util.Arrays.ArrayListArrays类的私有嵌套类),而不是java.util.ArrayList - Radiodef
1个回答

13

这个列表由数组支持,如Arrays.asList()中所述:

返回由指定数组支持的固定大小列表。(返回的列表对数组的更改是“写入”操作。)

如果你深入到代码行return new ArrayList<>(a),你会看到:

private final E[] a; // This is internal array of List

ArrayList(E[] array) {
    a = Objects.requireNonNull(array);
}

public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj; // Just return the array reference. No deep copy
}

正如您所看到的,列表并未复制数组数据,只是将其引用分配给其内部数组。

因此,您对原始数组的更改会反映在列表中,反之亦然。

请注意:Arrays.asList()返回Arrays.ArrayList<>的实例:

private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable {
}

java.util.ArrayList 不同,Arrays.asList 返回的 List 并没有实现所有的 List 函数。如果您尝试使用像 add() 这样的方法,它会抛出 UnsupportedOperationException 异常。


如果我对列表进行更改,那么数组也会反映出来吗? - Sivaram Chintalapudi
是的。对返回的列表所做的更改会“透过”写回到数组中。 - Mạnh Quyết Nguyễn
但是当我尝试向列表中添加元素时,我遇到了“main”线程中的异常java.lang.UnsupportedOperationException。 - Sivaram Chintalapudi
是的,明白了。谢谢。 - Sivaram Chintalapudi
最后一段中的add()已经隐含地被第一段所覆盖:“返回一个固定大小的列表”。尝试向固定大小的列表添加内容当然会失败。 - Gerold Broser
有没有库函数可以从数组中获取一个列表,该列表不会因为数组的更改而改变。 - Parzival

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接