当前位置: 首页 > 面试题库 >

Arrays.asList给出UnsupportedOperationException

殳俊
2023-03-14
问题内容

List通过返回Arrays.asList不能通过使用方法如被修改addremove。但是,如果将其传递给该Collections.sort方法,它将可以对数组进行排序而不会出现任何问题(我希望有一个例外)。这似乎是非常不一致的行为。那么ListasList方法返回的对允许的操作是什么?

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


问题答案:

Arrays.asList返回List由数组支持的固定大小。因此removeadd不支持。set支持。您可以List像对待数组一样看它。数组的长度固定。您不能添加或删除元素,但可以将值分配给数组的索引,这等效于的set方法List。您可以对数组进行排序。

Collections.sort(list)不会更改的大小List,因此可以对固定大小的列表进行排序。排序a所需要做的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方法它要求修改的Listset所述的ListListIterator,它调用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]);
  }
}


 类似资料:
  • 不能使用< code>add或< code>remove等方法修改由< code>Arrays.asList返回的< code>List。但是如果您将它传递给< code>Collections.sort方法,它可以毫无问题地对数组进行排序(我预计会出现异常)。这似乎是一种非常不一致的行为。那么< code>List上允许的操作是什么呢,它由< code>asList方法返回? 我在文档中找不到这

  • 问题内容: 使用Arrays.asList(something)优于Collections.singletonList(something)来构成包含一项的列表是否有优势(或有很大不同)?后者使返回的列表也不可变。 问题答案: 是 不可变的, 而数组是固定大小的表示形式,列表和数组在堆中连接在一起。 允许对其进行 非结构更改 ,这些 更改 将同时反映到List和联合数组中。 尽管您可以为特定索引设

  • 问题内容: 所以有,但这对可变参数有效。 如果我已经在数组中了怎么办?是否有方便的方法来创建此文件,或者我必须手动执行以下操作: 问题答案: 仅仅因为它与varargs一起工作并不意味着您不能正常调用它: 唯一棘手的问题是ifT是Object,您应该在其中使用强制类型转换来告诉编译器是否应将参数包装在数组中: 要么

  • 问题内容: 我有一个集合和一个数组。我试图将数组转换为集合c2并执行操作,但这会抛出异常。我发现,类收益类和这个类继承自其实现抛出。 有什么办法可以删除元素?请帮忙 问题答案: 返回数组的包装器。此包装具有固定的大小,并直接由数组支持,因此对的调用将修改数组,而修改列表的任何其他方法都将引发。 要解决此问题,你必须通过复制包装器列表的内容来创建新的可修改列表。通过使用ArrayList带有的构造函

  • 问题内容: 这种转换有什么问题? 在从array读取CreateArrayList中找到的解决方案后,我进行了此操作。第二行(排序)导致以下异常: 线程“主”中的异常java.lang.ClassCastException:[无法强制转换为java.lang.Comparable] 怎么了 我确实意识到可以使用进行排序,但我对此感到很好奇。 问题答案: 让我们考虑以下简化示例: 在println行

  • 本文向大家介绍Arrays.asList方法总结,包括了Arrays.asList方法总结的使用技巧和注意事项,需要的朋友参考一下 话不多说,请看代码: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!