【问题标题】:Iterator remove method迭代器移除方法
【发布时间】:2013-07-30 03:12:46
【问题描述】:

我有一个示例代码,但它不起作用:

List<Byte> myList = Arrays.asList(B);
Iterator<Byte> itr = myList.iterator();

while(itr.hasNext())  
{  
    Byte element = itr.next();  
    if(element == 32)  
    {  
        itr.remove();  
    }  
}

我无法理解为什么上面的代码会产生以下异常。

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(AbstractList.java:144)
at java.util.AbstractList$Itr.remove(AbstractList.java:360)

【问题讨论】:

  • 因为这正是文档所说的那样?

标签: java arraylist iterator byte removeclass


【解决方案1】:
List<Byte> myList = Arrays.asList(B);

返回一个无法修改的固定大小的列表。

【讨论】:

  • 如何创建可以修改的列表?
  • 我有 Byte[] B = new Byte[]; 数组
  • List myList = new ArrayList(Arrays.asList(B));
  • 谢谢!你能告诉我我需要把 放在括号里吗? List myList = new ArrayList (Arrays.asList(B));
  • 这取决于您的 JDK 级别。如果您使用 1.7 以下的 JDK,则必须使用 type in 'DIAMOND' 运算符。
【解决方案2】:

Arrays.asList(B); 返回一个固定大小的列表:您可以设置或获取项目,但不能删除或添加。这在the javadoc 中有解释:

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

要创建大小灵活的列表,您可以使用:

List<Byte> myList = new ArrayList<> (B.length);
Collections.addAll(myList, B);

这比以下更有效(仅创建一个对象)且可读性如下:

List<Byte> myList = new ArrayList<> (Arrays.asList(B));

【讨论】:

  • 如何创建可以修改的列表?我有 Byte[] B = new Byte[]; 数组
  • 我需要把 放在括号里吗? List myList = new ArrayList (Arrays.asList(B));
  • Java 6 可以,Java 7 或更高版本不行。
【解决方案3】:

Arrays.asList 返回Arrays.ArrayList,它是静态内部类,不会覆盖AbstractList 的删除操作,AbstractListdefault remove operation 会抛出UnsupportedOperationException

Find the openjdk code for Arrays.ArrayList.

【讨论】:

  • 我有 Byte[] B = new Byte[] 的数组;我需要将其转换为列表 如何创建可以修改的列表?
  • List myList = new ArrayList(Arrays.asList(B));
  • 我需要把 放在括号里吗? List myList = new ArrayList (Arrays.asList(B));
猜你喜欢
  • 2015-08-09
  • 1970-01-01
  • 2015-08-14
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2016-07-21
  • 1970-01-01
相关资源
最近更新 更多