【问题标题】:How to add elements in List when used Arrays.asList()使用 Arrays.asList() 时如何在 List 中添加元素
【发布时间】:2013-08-22 19:13:47
【问题描述】:

我们不能对从Arrays.asList 获得的集合执行<Collection>.add<Collection>.addAll 操作.. 只允许删除操作。

如果我遇到需要在List 中添加新元素而不删除List 中以前的元素的情况怎么办?我怎样才能做到这一点?

【问题讨论】:

  • 为什么不能添加? asList 返回 new ArrayList。哦,不一样ArrayList
  • @SotiriosDelimanolis Arrays.asList 返回的列表由传入的数组支持,并且不可修改。来自the documentation(已添加重点),“返回由指定数组支持的固定大小列表。(将返回的列表更改为“写入”数组。 ) 此方法充当基于数组和基于集合的 API 之间的桥梁,与 Collection.toArray() 结合使用。返回的列表是可序列化的并实现 RandomAccess。"
  • @JoshuaTaylor 没注意到是java.util.Arrays.ArrayList
  • @SotiriosDelimanolis 好吧,javadoc 只保证它是一个固定大小的列表,虽然是的,它看起来确实是一个java.util.Arrays$ArrayListjava.util.ArrayLists 当然,一般来说,是可以修改的。
  • @prafulsurve 也不允许删除操作; Arrays.asList 返回的列表的大小是固定的。一个简单的测试将确认您既不能向列表中添加元素,也不能从列表中删除元素。

标签: java list


【解决方案1】:

使用构造函数创建一个新的ArrayList

List<String> list = new ArrayList<String>(Arrays.asList("a", "b"));

【讨论】:

  • 或 Stream.of("a", "b", "c").collect(Collectors.toList())
【解决方案2】:

如今,流 API 可以轻松地以简洁实用的方式为您提供ArrayList

Stream.of("str1", "str2").collect(Collectors.toList()));

当然,这也可以灵活地使用映射进行转换。例如,在为 Spring 安全代码编写单元测试时,编写以下代码很方便:

Stream.of("ROLE_1", "ROLE_2").map(SimpleGrantedAuthority::new).collect(Collectors.toList()));

Collectors.toList 返回的列表是ArrayList,可以根据您的代码要求进行修改。

【讨论】:

    【解决方案3】:

    一种方法是构造一个新的ArrayList

    List<T> list = new ArrayList<T>(Arrays.asList(...));
    

    完成后,您可以随意修改list

    【讨论】:

      【解决方案4】:

      Arrays.asList(),生成一个实际上由数组支持的列表,它是一个变形为列表的数组。您可以将其用作列表,但不能对其执行某些操作,例如添加新元素。所以最好的选择是将它传递给另一个列表 obj 的构造函数,如下所示:

      List<T> list = new ArrayList<T>(Arrays.asList(...));
      

      【讨论】:

        【解决方案5】:

        您可以使用 Java8 流绕过中间 ArrayList

            Integer[] array = {1, 2, 3};
            List<Integer> list = Streams.concat(Arrays.stream(array),
                                                Stream.of(4)).collect(Collectors.toList());
        

        这应该非常有效,因为它可以遍历数组并预先分配目标列表。对于大型阵列,它可能会更好,也可能不会更好。与往常一样,如果重要,您必须衡量。

        【讨论】:

          【解决方案6】:

          Collection 的构造函数,例如以下示例中的 ArrayList,将数组作为列表并使用该列表的元素构造一个新实例。

          List<T> list = new ArrayList<T>(Arrays.asList(...));
          

          http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList(java.util.Collection)

          【讨论】:

            【解决方案7】:

            Arrays.asList()

            在对象创建时生成一个不可修改的列表。您可以使用以下代码。

            List list = Collections.synchronizedList(new ArrayList(...));
            

            此转换允许列表添加和删除对象。我只在 java 8 中测试过。

            【讨论】:

              【解决方案8】:
              ArrayList<Object> MyObjectList = new ArrayList<>();
              Arrays.asList(params[1]).forEach((item)-> {
                  MyObjectList.add(item);
              });
              

              【讨论】:

              • 感谢您的贡献!但是,您应该在您的答案中添加一些 cmets,以说明您的解决方案与公认的答案相比有什么优势,或者其他哪些新情况使您的解决方案更具吸引力。
              猜你喜欢
              • 1970-01-01
              • 2016-02-29
              • 2012-06-26
              • 1970-01-01
              • 1970-01-01
              • 2016-09-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多