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

遍历集合以添加项,但引发ConcurrentModificationException

燕经国
2023-03-14
package com.ripal;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Iterator;

public class Outputs {

    public void show() {
        final ArrayList<String> list = new ArrayList<String>();

        list.add("banana");
        list.add("apple");

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

        Collections.sort(list);
        while (itr.hasNext()) {
            System.out.println(itr.next() + " ");
        }
    }
}

class Test {

    public static void main(String[] args) {
        Outputs outputs = new Outputs();
        outputs.show();
    }
}

共有1个答案

池麒
2023-03-14

ArrayList有一个fail fast迭代器。只能通过迭代器修改集合。在调用迭代器方法并抛出ConcurrentModificationException之后,在外部进行的任何其他修改都会很快被检测到。在您的例子中,在创建迭代器之后,对数组进行适当的排序,排序例程修改数组的内容,导致在使用迭代器时出现ConcurrentModificationException。要解决这个问题,只需在创建迭代器之前执行排序。看起来是这样的。

Collections.sort(list);
Iterator<String> itr = list.iterator();
 类似资料:
  • Map 集合的遍历与 List 和 Set 集合不同。Map 有两组值,因此遍历时可以只遍历值的集合,也可以只遍历键的集合,也可以同时遍历。Map 以及实现 Map 的接口类(如 HashMap、TreeMap、LinkedHashMap、Hashtable 等)都可以用以下几种方式遍历。 1)在 for 循环中使用 entries 实现 Map 的遍历(最常见和最常用的)。 2)使用 for-e

  • 《 Java Iterator遍历Collection集合元素》一节中主要讲解如何使用 Iterator 接口迭代访问 Collection 集合里的元素,除了这个方法之外,我们还可以使用 Java 5 提供的 foreach 循环迭代访问集合元素,而且更加便捷。如下程序示范了使用 foreach 循环来迭代访问集合元素。 输出结果为: 小牛知识库C++教程 小牛知识库C语言教程 小牛知识库Jav

  • 集合的遍历 在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口Iterator。Iterator接口也是Java集合中的一员,但它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。 Iterator迭代器对

  • Java 8 为 Iterable 接口新增了一个 forEach(Consumer action) 默认方法,该方法所需参数的类型是一个函数式接口,而 Iterable 接口是 Collection 接口的父接口,因此 Collection 集合也可直接调用该方法。 当程序调用 Iterable 的 forEach(Consumer action) 遍历集合元素时,程序会依次将集合元素传给 Co

  • 运行此代码时: 引发异常: 系统。无效操作异常:集合被修改;枚举操作可能无法执行。 怎么做。NET知道该集合在枚举器迭代该集合时被修改了吗?集合对象中是否有此标志?

  • 问题内容: 众所周知,我们可以使用循环遍历或。但是,我想这样迭代自己: 为了使之成为可能,必须支持哪些操作/协议? 问题答案: 假设您有一个类“ Cars”,希望使用for..in循环进行迭代: 最简单的方法是将AnyGenerator与以下类一起使用: 要尝试一个完整的工作示例,请添加上面的两个类,然后尝试像这样使用它们,并添加几个测试项: 就是这样,很简单。 更多信息:http://lilly