【问题标题】:Arrays.asList give UnsupportedOperationException [duplicate]Arrays.asList 给出 UnsupportedOperationException [重复]
【发布时间】:2015-07-22 08:49:45
【问题描述】:

Arrays.asList返回的List不能使用addremove等方法修改。但是如果你将它传递给Collections.sort 方法,它可以毫无问题地对数组进行排序(我预计会出现异常)。这似乎是一种非常不一致的行为。那么asList 方法返回的List 上允许的操作是什么?

List<Integer> list = Arrays.asList(5,7, 10 , 8,9);
list.remove(2);//Exception

Collections.sort(list);//Ok, No Exception Sort...
System.out.println(list);

我在文档中找不到任何线索。

编辑: 是的,我可以理解为什么它不支持removeadd。但那它怎么支持排序呢?

【问题讨论】:

    标签: java collections


    【解决方案1】:

    Arrays.asList 返回由数组支持的固定大小的List。因此不支持removeadd。支持set。您可以查看此List,就好像它的行为与数组完全一样。数组具有固定长度。不能添加或删除元素,但可以为数组的索引赋值,相当于Listset方法。并且可以对数组进行排序。

    Collections.sort(list) 不会改变List 的大小,因此可以对固定大小的列表进行排序。对List 进行排序所需的只是交换List 的元素。为此,set(index,element) 就足够了。

    所有这些信息都可以在 Arrays 的 Javadoc 中找到:

    /**
     * Returns a fixed-size list backed by the specified array.  (Changes to
     * the returned list "write through" to the array.)  This method acts
     * as bridge between array-based and collection-based APIs, in
     * combination with {@link Collection#toArray}.  The returned list is
     * serializable and implements {@link RandomAccess}.
     *
     * <p>This method also provides a convenient way to create a fixed-size
     * list initialized to contain several elements:
     * <pre>
     *     List&lt;String&gt; stooges = Arrays.asList("Larry", "Moe", "Curly");
     * </pre>
     *
     * @param a the array by which the list will be backed
     * @return a list view of the specified array
     */
     public static <T> List<T> asList(T... a)
    

    如果您查看Collections.sort 的实现,您会发现它实际上对数组进行了排序。唯一需要修改ListList方法是ListListIteratorset,它调用Listset(index,element)方法。

    public static <T extends Comparable<? super T>> void sort(List<T> list) {
      Object[] a = list.toArray();
      Arrays.sort(a);
      ListIterator<T> i = list.listIterator();
      for (int j=0; j<a.length; j++) {
          i.next();
          i.set((T)a[j]);
      }
    }
    

    【讨论】:

    • 使用 java 8,Collections.sort(List) 更加智能,它只是委托给列表本身进行排序。 List 接口中的默认实现与 Java 7 中的 Collections.sort() 基本相同;但是列表现在有机会通过将排序实现为“就地”来避免额外的数组。例如,Arrays.asList(...) 和普通的 ArrayList 通过在其内部存储阵列上调用 Arrays.sort() 来做到这一点。
    【解决方案2】:

    Arrays.asList 给你一个List,由你给它的数组支持。数组是固定大小的。包装 List 支持与数组相同的操作,因此您可以重新分配条目,但不能更改其长度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2015-06-09
      • 2011-11-04
      • 2014-10-24
      • 1970-01-01
      • 2015-10-03
      相关资源
      最近更新 更多