【问题标题】:I cannot add in a List [duplicate]我无法添加列表 [重复]
【发布时间】:2019-02-26 14:52:55
【问题描述】:

我有下一个代码:

List<String> str=Arrays.asList("cat","tiger","dog","mouse");
str.add("horse");

它可以编译,但在运行时我有 UnsupportedOperationException。为什么会这样?

【问题讨论】:

    标签: java


    【解决方案1】:

    Arrays.asList(String...) 创建一个不可修改的数组。像这样用另一个ArrayList 包裹它:

    List<String> str = new ArrayList<>(Arrays.asList("cat","tiger","dog","mouse"));
    str.add("horse");
    

    【讨论】:

      【解决方案2】:

      这称为后备列表。 backed list 它是在您将数组转换为列表时创建的,但请记住,数组中的元素与列表中的元素链接,因此您无法添加或删除任何内容,并且您使用的 varargs 类似于数组,

      【讨论】:

        【解决方案3】:

        Arrays.asList() 返回一个 fixed-size and backed by the array you pass 列表,因此您不能添加或删除元素,因为这也意味着更改数组。 (请注意,如果您查看源代码,您会发现 Arrays.asList() 将返回一个 java.util.Arrays.ArrayList 的实例,您不应将其与您可能已经知道的 java.util.ArrayList 混淆)。

        相反,您需要创建另一个列表,例如通过调用 new ArrayList&lt;String&gt;( Arrays.asList(...)) 来有效地复制传递的列表。

        Java 8+ 的方式可能是这样的:

        List<String> str = Stream.of( "cat","tiger","dog","mouse" ).collect( Collectors.toList() );
        

        【讨论】:

        • 当你说 java.util.Arrays.ArrayList 是因为这个 ArrayList 是一个嵌套的数组类,但我不这么认为。方法 Arrays.asList() 返回一个 java.util.List,没有 java.util.Arrays.ArrayList。
        • @JoseNg 不,该方法的签名声明它将返回扩展或实现 List 的内容(即返回接口),但实际实现将是 java.util.Arrays.ArrayList - 看看源代码(我找不到当前源代码库的链接,但这是我的 IDE 中 Arrays.asList(...) 的方法主体:return new ArrayList&lt;&gt;(a);)。
        猜你喜欢
        • 2020-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-29
        • 1970-01-01
        • 2020-12-24
        相关资源
        最近更新 更多