List
返回的Arrays.asList
无法使用add
或remove
等方法进行修改。但是如果你将它传递给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);
我在文档中找不到任何线索。
修改:是的,我可以理解为什么它不支持remove
或add
。但那么它如何支持排序呢?
答案 0 :(得分:10)
Arrays.asList
返回由数组支持的固定大小List
。因此,不支持remove
和add
。支持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<String> 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
支持与数组相同的操作,因此您可以重新分配条目,但不能更改其长度。