我正在经历Arrays.asList()
的实现。如果我们尝试通过List(I)
特定方法更改数组的大小,则获得 RE: UnsupportedException
。实现-
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
根据上面的实现,既然ArrayList
对象是由asList
返回的,为什么我们不能改变返回List
对象的大小呢?
具体来说,是什么阻止了更改返回的ArrayList
对象的大小?
任何线索都将有所帮助和赞赏。
Arrays.asList()
返回的List
部分是不可变的。一些突变操作已实现,而其他则未实现。基本上,所有写入底层数组的操作都是实现的。不会执行需要重新分配新阵列的操作。 例如,set()
实现了,add()
没有实现。如果您需要一个在各个方面都可变的适当List
:
List<T> myList = asList(v1, v2, v3); // Immutable
List<T> myList = new ArrayList<>(asList(v1, v2, v3)); // Mutable
Arrays.asList()
返回的List
不是"正常"(java.util.)ArrayList
。正常的ArrayList
可以通过重新分配其后备阵列来增长,这意味着它是一个由阵列支持的适当List
,但具有所有可用的List
功能。
Arrays.asList()
返回的List
是原始数组上的"List
视图"。它无法增长,因为这会丢失与原始阵列的链接。以下代码对此进行了演示:
String[] data = { "foo", "bar" };
List<String> values = Arrays.asList(data);
System.err.println(values); // [foo, bar]
data[0] = "buzz";
values.set(1, "quak");
System.err.println(values); // [buzz, quak]
System.err.println(Arrays.toString(data)); // [buzz, quak]