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

时间:2019-03-23 19:55:12

标签: java arrays list arraylist

我正在经历Arrays.asList()的实现。如果我们尝试通过List(I)特定方法来更改数组的大小,则会获得RE:UnsupportedException。 实施-

public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

根据上述实现,由于ArrayList返回了asList对象,为什么我们不能更改返回的List对象的大小?

具体说来,是什么阻止了人们更改返回的ArrayList对象的大小?

任何潜在客户都会有所帮助和赞赏。

1 个答案:

答案 0 :(得分:4)

List返回的Arrays.asList()是部分不可变。一些突变操作已实现,而其他则没有。基本上,所有写入底层数组的操作都可以实现。未实现需要重新分配新数组的操作。例如,实现了set(),而没有实现add()。如果您需要在各个方面进行适当的List可变:

List<T> myList = asList(v1, v2, v3); // Immutable
List<T> myList = new ArrayList<>(asList(v1, v2, v3)); // Mutable

List返回的Arrays.asList()不是“正常” (java.util.)ArrayList。普通的ArrayList可以通过重新分配其后备数组来增长,这意味着它是由数组支持的适当的List,但具有所有List功能。

List返回的Arrays.asList()是原始数组上的“ 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]