Arrays.asList给出UnsupportedOperationException

时间:2015-05-11 18:05:55

标签: java collections

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

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。但那么它如何支持排序呢?

2 个答案:

答案 0 :(得分:10)

Arrays.asList返回由数组支持的固定大小List。因此,不支持removeadd。支持set。您可以查看此List,就像它的行为完全类似于数组一样。数组具有固定长度。您无法添加或删除元素,但您可以为数组的索引指定值,这相当于set的{​​{1}}方法。你可以对数组进行排序。

List并未更改Collections.sort(list)的大小,因此可以对固定大小的列表进行排序。为了对List进行排序,您只需要交换List的元素。为此,List就足够了。

所有这些信息都可以在set(index,element)的Javadoc中找到:

Arrays

如果你看一下/** * 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 List List set List所需的ListIterator方法List调用set(index,element) &#39; 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]); } } 方法。

Activity

答案 1 :(得分:1)

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