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

尝试从Array.asList返回的列表中删除时出现UnsupportedOperationException

姜鸿
2023-03-14

我使用List保存通过调用数组获得的一些数据。asList()方法。然后,我尝试使用myList删除一个元素。删除(int i)方法。但当我尝试这样做时,我得到了一个UnsupportedOperationException。这其中的原因是什么?我应该如何解决这个问题?

共有3个答案

汝彭薄
2023-03-14

请阅读Arrays.asList()的API文档:

返回由指定数组支持的固定大小的列表。(对返回列表的更改“直写”到数组。)

请注意,集合。remove(int)在Javadocs中标记为“可选操作”,这意味着并非所有Collections都支持它。“固定大小列表”意味着您无法更改列表的大小,而remove()可以这样做。所以它不受支持。

如果要更改由数组生成的列表,只需复制它,例如新的数组列表(数组。

冯野
2023-03-14

不是< code>java.util.ArrayList。< code>Arrays.asList()返回自己的< code>List实现(将更改“写入”到数组中)。).

这是一个固定大小的列表,因此不支持删除。

您可以从中创建一个真正的ArrayList:

new java.util.ArrayList<>(Arrays.asList(someArray));  

我必须承认,asList()的工作方式非常令人困惑。

翟光赫
2023-03-14

数组。asList()在列表界面包装数组。该列表仍由阵列支持。数组是固定大小的-它们不支持添加或删除元素,因此包装器也不能。

医生没有尽可能说清楚,但是他们说:

返回由指定数组支持的固定大小的列表。

“固定大小”位应该是一个提示,表明您无法添加或删除元素:)

尽管有其他方法(从数组创建新的< code>ArrayList而不需要额外的库)来解决这个问题,但我个人还是建议使用Google Collections库(或者Guava,当它发布时)。然后,您可以使用:

List<Integer> list = Lists.newArrayList(array);

我之所以建议这样做,是因为GCL通常是一件好事,非常值得使用。

如注释中所述,这需要数组的副本;该列表不受原始数组的支持,并且任何一个集合中的更改都不会在另一个集合中看到。

 类似资料:
  • 问题内容: 我有以下代码: 我得到这个: 这怎么会是正确的方法?Java 15 问题答案: 你的代码有很多问题: 在返回一个固定大小的列表 从API: :返回指定数组支持的固定大小的列表。 你不能做到 你不能。你无法在结构上修改。 Fix 创建一个,支持更快。 关于split正则表达式 从API: :在给定正则表达式的匹配项周围拆分此字符串。 是正则表达式元字符;如果要拆分文字,则必须将其转义为J

  • 我试图编辑我的deletar()方法,把一个迭代器移除元素,但没有工作,错误继续。

  • 实际上,在按下一个按钮后,我有一个方法可以检查itemStorico ArrayList中是否存在从itemModel添加的新项,然后如果该项存在于名为itemModel的新列表中,我将从itemStorico中删除旧项并添加新项,否则只添加新项而不删除旧项。 但我得到以下错误: 下面是我的方法中的代码:

  • 问:反转一个列表(自己做方法,不要用集合) 我收到一个错误< code > UnsupportedOperationException 试验 我不明白为什么在< code>list.remove(0)上出现< code > UnsupportedOperationException ;

  • 在mysql工作台中,我试图执行 这是一个查询,但是我收到了这个消息 错误代码:1175。您使用的是安全更新模式,并且您试图更新一个没有使用键列禁用安全模式的表,请在“首选项”中切换该选项-

  • 问题内容: 我有这段代码: 但我得到的结果是: 当然,我期望低于20的数字不会出现在结果中,我假设我对删除操作做错了什么。 问题答案: 在遍历列表时,你正在修改它。这意味着第一次遍历循环时,i==1,因此1从列表中删除。然后for循环转到列表中的第二项,不是2,而是3!然后从列表中删除,然后for循环转到列表中的第三项,现在是5。等等。也许这样更容易想象,用表示的值: 最初是列表的状态;然后删除1