我正在经历Arrays.asList()
的实现。如果我们尝试通过List(I)
特定方法来更改数组的大小,则会获得RE:UnsupportedException
。
实施-
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
根据上述实现,由于ArrayList
返回了asList
对象,为什么我们不能更改返回的List
对象的大小?
具体说来,是什么阻止了人们更改返回的ArrayList
对象的大小?
任何潜在客户都会有所帮助和赞赏。
答案 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]