我已经看到了代码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
归档时间: |
|
查看次数: |
158 次 |
最近记录: |