【发布时间】:2019-02-26 14:52:55
【问题描述】:
我有下一个代码:
List<String> str=Arrays.asList("cat","tiger","dog","mouse");
str.add("horse");
它可以编译,但在运行时我有 UnsupportedOperationException。为什么会这样?
【问题讨论】:
标签: java
我有下一个代码:
List<String> str=Arrays.asList("cat","tiger","dog","mouse");
str.add("horse");
它可以编译,但在运行时我有 UnsupportedOperationException。为什么会这样?
【问题讨论】:
标签: java
Arrays.asList(String...) 创建一个不可修改的数组。像这样用另一个ArrayList 包裹它:
List<String> str = new ArrayList<>(Arrays.asList("cat","tiger","dog","mouse"));
str.add("horse");
【讨论】:
这称为后备列表。 backed list 它是在您将数组转换为列表时创建的,但请记住,数组中的元素与列表中的元素链接,因此您无法添加或删除任何内容,并且您使用的 varargs 类似于数组,
【讨论】:
Arrays.asList() 返回一个 fixed-size and backed by the array you pass 列表,因此您不能添加或删除元素,因为这也意味着更改数组。 (请注意,如果您查看源代码,您会发现 Arrays.asList() 将返回一个 java.util.Arrays.ArrayList 的实例,您不应将其与您可能已经知道的 java.util.ArrayList 混淆)。
相反,您需要创建另一个列表,例如通过调用 new ArrayList<String>( Arrays.asList(...)) 来有效地复制传递的列表。
Java 8+ 的方式可能是这样的:
List<String> str = Stream.of( "cat","tiger","dog","mouse" ).collect( Collectors.toList() );
【讨论】:
List 的内容(即返回接口),但实际实现将是 java.util.Arrays.ArrayList - 看看源代码(我找不到当前源代码库的链接,但这是我的 IDE 中 Arrays.asList(...) 的方法主体:return new ArrayList<>(a);)。