当前位置: 首页 > 知识库问答 >
问题:

Arrays.asList给Un支撑的操作异常[重复]

别俊誉
2023-03-14

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

我在文档中找不到这方面的任何线索。

编辑:是的,我能理解为什么它不支持< code >删除或< code >添加。但是它怎么支持排序呢?

共有2个答案

柯翔
2023-03-14

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

程举
2023-03-14

< code>Arrays.asList返回由数组支持的固定大小的< code >列表。因此,不支持< code>remove和< code>add。支持< code>set。您可以查看这个< code>List,就好像它的行为完全像一个数组一样。数组的长度是固定的。不能添加或移除元素,但可以为数组的索引赋值,这相当于< code>List的< code>set方法。你可以对数组进行排序。

< code > collections . sort(List)不改变< code>List的大小,因此可以对固定大小的列表进行排序。要对< code>List进行排序,您只需交换< code>List的元素。为此,< code>set(index,element)就足够了。

所有这些信息都可以在数组的爪哇多克中找到:

/**
 * 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)

如果你看一下集合.sort的实现,你会看到它实际上对一个数组进行了排序。修改列表所需的唯一 List 方法是列表的 ListIterator 的集合,它调用列表的集合(索引,元素)方法。

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]);
  }
}
 类似资料:
  • 相反,将引发“UnsupportedOperationException”。看起来ContainerRequest没有从修改的请求中提取UserPrincipal。 修改是通过 问题是如何将主体信息从HttpServerProbe传输到ContainerRequestFilter。request具有安全信息(在本例中是SSL客户机证书信息),而com.sun.jersey.spi.containe

  • 我不知道;我不太明白在哪里可以抛出这个异常。 例如,我正在实现

  • 我想从excel(.xlsx)文件中读取超过60万行。 我使用的是ApachePOI和xlsx拖缆。 Apache poi版本为3.15,因为xlsx streamer在上述版本中不支持 我只想迭代特定的列。我尝试过的是: 我得到这个例外,几乎没有警告 第35行是

  • 下面是在strList5的subList.clear()调用中引发异常的代码: 我清除子列表的方式有问题吗?或者这是8Java的臭虫?我的Java8在Mac上的版本是:java版本"1.8.0_45"Java(TM)SE运行时环境(构建1.8.0_45-b14)JavaHotSpot(TM)64位服务器VM(构建25.45-b02,混合模式)

  • 问题内容: 在通过返回不能通过使用方法如被修改或。但是,如果将其传递给该方法,它将可以对数组进行排序而不会出现任何问题(我希望有一个例外)。这似乎是非常不一致的行为。那么,方法返回的对允许的操作是什么? 我在文档中找不到任何线索。 编辑: 是的,我可以理解为什么它不支持或。但是,它如何支持排序呢? 问题答案: 返回由数组支持的固定大小。因此,不支持。支持。您可以像对待数组一样看它。数组的长度固定。

  • 问题内容: 当我运行以下代码时,没有输出输出。 问题答案: 当您将原始数组(以您的情况为例)传递给时,它将创建一个具有单个元素的数组- 数组本身。因此返回false。将返回true。 如果您使用代替,它将起作用。 进一步说明: 的签名为。基元不能替换泛型类型参数。因此,当您将此方法传递给an时,整个数组将被替换,并得到a。另一方面,当您将传递给该方法时,替换将获得。