如果我更改传递给Arrays.asList(array)的数组,列表值会更改

Siv*_*udi 3 java arrays

我已经看到了代码Arrays.class,但是无法理解为什么对数组所做的更改反映到ArrayList,即使下面的代码返回了新的ArrayList.

@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}
Run Code Online (Sandbox Code Playgroud)

示例代码:

    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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

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

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

Mạn*_*yễn 10

该列表由关于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
}
Run Code Online (Sandbox Code Playgroud)

如您所见,列表不会复制数组数据,只需将其引用分配给其内部数组即可.

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

注意:Arrays.asList()返回一个实例Arrays.ArrayList<>:

private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable {
}
Run Code Online (Sandbox Code Playgroud)

与之不同的是java.util.ArrayList,List返回者Arrays.asList并未实现所有List函数.如果你尝试使用类似的方法add(),它会抛出UnsupportedOperationException