为什么我们不能增加 asList() 返回的 ArrayList 对象的大小?



我正在经历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]

最新更新