【问题标题】:What is purpose of using asList?使用 asList 的目的是什么?
【发布时间】:2011-10-17 00:33:29
【问题描述】:

我只是想知道Arrays 中的方法asList() 的好处和目的是什么。

它返回一个由指定数组支持的固定大小的列表,因此我们不能向该列表添加元素,它就像一个数组(我们不能向它添加元素)。有没有办法将固定大小的列表转换为不固定大小的列表?

当我尝试将元素添加到固定大小的列表时,它会抛出 UnsupportedOperationException:

Double[] d = {3.0, 4.0, 5.0};
List<Double> myList = Arrays.asList(d);
myList.add(6.0); // here it will throw an exception

【问题讨论】:

    标签: java list exception arraylist


    【解决方案1】:

    只是一些 cmets,java 文档说明了一切:

    public static <T> List<T> asList(T... a)
    
    Returns a fixed-size list backed by the specified array.
    

    在下面,asList 返回一个Array.ArrayList 实例,与java.util.ArrayList 不同。唯一允许您修改列表的方法是:

    public E set(int index, E element) {...}
    

    【讨论】:

      【解决方案2】:

      您不能将其转换为可变大小的列表,但您可以创建一个新的:

      List<Double> myOtherList = new ArrayList<Double>(myList);
      myOtherList.add(6.0);
      

      另外,请注意 myList 是数组上的一个视图。所以如果你改变数组

         d[0] = 0.0;
         System.out.println(myList);
      

      你会得到 [0.0, 4.0, 5.0]

      在许多情况下,固定大小的列表就可以了,但当然这取决于您在做什么。我个人倾向于在测试用例中大量使用 Arrays.asList。

      【讨论】:

        【解决方案3】:

        来自 java 文档:

        “此方法充当基于数组和基于集合的 API 之间的桥梁”

        关于你的问题;

        Double[] d = {3.0, 4.0, 5.0};
        List<Double> yourList = new ArrayList(Arrays.asList(d));
        yourList.add(6.0);
        

        【讨论】:

          【解决方案4】:

          用于需要List(或List 的某些超级接口,例如CollectionIterable)作为参数的其他方法。即,

          Double[] doubles = { 0d, 1d, 2d };
          //... somewhere ...
          someMethodThatRequiresAList(Arrays.asList(doubles));
          //... elsewhere that you can't change the signature of ...
          public void someMethodThatRequiresAList(List<Double> ds) { /* ... */ };
          

          【讨论】:

            【解决方案5】:

            它用于以List 的形式创建数组的视图,因此您可以将其传递给许多接受List/Collection 的方法。

            【讨论】:

              【解决方案6】:

              来自 javadocs:

              此方法充当基于数组和基于集合之间的桥梁 API,与 Collection.toArray() 结合使用。

              因此,如果您希望能够将数组传递给期望 Collection 的方法,这提供了一种方便的方法。

              【讨论】:

                猜你喜欢
                • 2021-08-31
                • 2018-05-27
                • 2021-01-31
                • 2015-11-17
                • 1970-01-01
                • 1970-01-01
                • 2021-12-24
                • 2017-01-10
                • 2010-10-08
                相关资源
                最近更新 更多