UnsupportedOperationException 与 ConcurrentModificationExcetion

UnsupportedOperationException vs ConcurrentModificationExcetion

我有一个代码可以将数据添加到列表中。我不明白的是为什么 UnsupportedOperationException 在一种情况下被抛出并且 ConcurrentModificationException 在另一个。 在这两种情况下,我都在列表中添加数据,然后尝试删除列表 遍历列表时的数据。 到目前为止我所读到的是,每当对 fail-fast collection,ConcurrentModificationException 被抛出。那么为什么这个 在这两种情况下有不同的行为?

  List<String> animalList = new ArrayList<>();
        animalList.add("cat");
        animalList.add("dog");
        animalList.add("bear");
        animalList.add("lion");

        Iterator<String> iter = animalList.iterator();

        while(iter.hasNext()){
            String animal = iter.next();
            System.out.println(animal);
            animalList.remove(3);
        }

此代码抛出 ConcurrentModificationException

String[] strings = { "Java", "Honk", "Test" };

        List<String> list = Arrays.asList(strings);


        Iterator<String> iterator = list.iterator();

        while(iterator.hasNext()){
            String name = iterator.next();
            System.out.println(name);
            list.remove(3);
        }

而这个抛出 UnsupportedOperationException

Arrays.asList 不是 return ArrayList。事实上,列表 returned 是不可修改的,因此当您尝试修改它时,它会抛出 UnsupportedOperationException。

对于获得 ConcurrentModificationException 的代码块,您会得到该异常,因为您在 List 上创建了一个迭代器,然后直接从循环内的列表中删除,因此迭代器有问题。您应该使用迭代器本身的 remove() 方法 - Iterator.remove()

从外部迭代器循环中删除元素时,应直接从列表中删除元素。 See this another SO Question

在第二种情况下,使用 Arrays.asList ,您会得到一个 List 但实际列表对象可能不是 ArrayList 并且 remove(int index) 操作在 [=11 处是可选的=] 界面。 See this

总而言之,就 UnsupportedOperationException 而言,在第一种情况下,您可以保证使用 ArrayList,对于 class,支持删除操作,See this

对于第二种情况,你不能那么肯定。 Arrays.asListRefer documentation 表示返回的列表大小固定,因此不支持某些操作。