`
kabike
  • 浏览: 609855 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

增强for循环里操作集合抛出ConcurrentModificationException

阅读更多
自定义了一个简单的Student类,发现如下方法会抛出一个
java.util.ConcurrentModificationException

		List<Student> studentList = new ArrayList<Student>();
		Student s = new Student();
		s.setId(1);
		s.setName("student1");
		studentList.add(s);

		s = new Student();
		s.setId(2);
		s.setName("student2");
		studentList.add(s);

		s = new Student();
		s.setId(3);
		s.setName("student3");
		studentList.add(s);

		for (Student student : studentList) {
			if (student.getId().equals(1)) {
				studentList.remove(s);
			}
		}


这是因为增强for循环实际上还是使用了List的Iterator,而Iterator是快速失败的,即在Iterator进行迭代的过程中不能改变Collection的结构,所以不能在迭代的过程中添加或者删除元素.

要避免这个问题可以使用Iterator自带的remove方法
Iterator<Student> iterator = studentList.iterator();
		while (iterator.hasNext()) {
			if (iterator.next().getId().equals(id)) {
				iterator.remove();
			}
		}


或者重写Student的equals方法
Student studentToDelete = new Student();
		studentToDelete.setId(1);
		studentList.remove(studentToDelete);

不过后者的限制是只移除第一个符合条件的元素
分享到:
评论

相关推荐

    Java中增强for循环的实现原理和坑详解

    这段代码可能会抛出ConcurrentModificationException异常,因为在遍历过程中,集合的内容被修改了。 要避免这种情况,可以使用迭代器的remove方法来删除当前迭代对象,而不是使用集合的remove方法: Iterator...

    JDK5增强for循环的使用

    1. **不可变性**:在增强for循环内部,你不能修改正在迭代的集合或数组,因为这可能导致不确定的行为或抛出`ConcurrentModificationException`。 2. **无索引访问**:增强for循环不提供直接的索引访问,如果你需要...

    遍历并批量删除容器中元素出现ConcurrentModificationException原因及处置

    - 当你使用`for-each`循环(增强for循环)遍历集合时,实际上底层是通过迭代器实现的。但是,如果你在循环内部直接修改集合(比如删除元素),而不是通过迭代器的`remove()`方法,那么迭代器将无法跟踪这些变化,...

    java中for循环删除集合陷阱

    在这种情况下,Java会自动处理迭代器,不允许在循环内部进行集合的增删改操作,否则会抛出`ConcurrentModificationException`异常。 然而,在常规for循环中,开发者可能会尝试手动遍历集合并删除元素,如以下代码所...

    迭代大师的修炼之道:Java中Iterator与增强for循环的深度解析

    - `Enhanced for loop`在遍历过程中不允许直接修改正在迭代的集合,否则会抛出`ConcurrentModificationException`异常。 - 当需要在遍历的同时修改集合时,应考虑使用`Iterator`或其他方法。 #### 四、进阶篇:...

    java集合类遍历的同时如何进行删除操作.docx

    这种方式会抛出`ConcurrentModificationException`,因为在for-each循环中直接调用了`remove()`,改变了集合结构,而迭代器并未同步更新。 - **操作3**:使用迭代器`iterator3`遍历`list3`并删除元素。尽管使用了...

    java集合,java集合

    7. **迭代器(Iterator)**:迭代器是访问集合元素的主要方式,提供了add、remove和hasNext等方法,遵循fail-fast原则,即如果在迭代过程中修改集合,迭代器会抛出ConcurrentModificationException。 8. **...

    Java集合面试问题

    - **Fail-fast**:当多个线程同时访问同一个集合时,如果其中有一个线程修改了集合的内容,则其他正在遍历该集合的线程可能会抛出`ConcurrentModificationException`异常。 - 实现机制:通过在集合内部维护一个修改...

    Iterator与fast-fail机制.pdf

    当多个线程同时遍历一个集合并修改集合状态时,如果没有适当的同步控制,可能会导致迭代器抛出ConcurrentModificationException。这是因为迭代器在创建时会记住集合的“快照”,如果集合在迭代过程中被修改,迭代器...

    Java集合类面试题.docx

    当集合在迭代过程中被修改,除了通过迭代器自身的remove()方法,fail-fast机制会抛出ConcurrentModificationException,以防止数据不一致。 14. **fail-fast与fail-safe有什么区别?** fail-fast会在检测到并发...

    13.foreach循环_java_

    在Java编程语言中,`foreach`循环,也称为增强型for循环或迭代器循环,是处理数组和集合数据的一种简洁高效的方式。这个小视频详细介绍了如何在Java中正确使用`foreach`循环,让我们深入探讨一下相关知识点。 首先...

    集合框架以及泛型的相关应用

    这是因为在迭代器内部有一个状态,记录了集合的预期状态,当集合被其他方式修改时,这个状态就会不匹配,从而抛出异常。 7. **集合操作**:通过示例代码可以看到,`ArrayList`的`add()`方法用于添加元素,`remove()...

    java 使用foreach遍历集合元素的实例

    `foreach`循环也被称为增强for循环,它的主要目的是简化对数组和集合的迭代操作。在本实例中,我们将深入探讨如何使用`foreach`循环遍历集合元素,并理解其工作原理以及可能遇到的问题。 首先,让我们看下给出的...

    Java 实例 - List 循环移动元素源代码+详细指导教程.zip

    迭代器是Java集合框架提供的一种统一的遍历方式,它可以安全地删除元素,而不会抛出ConcurrentModificationException。以下是一个使用迭代器移动元素的例子: ```java List&lt;String&gt; list = new ArrayList(); // ...

    Java集合容器面试题(2024最新版)-重点.docx

    - 当多个线程同时访问一个非线程安全的集合并进行修改时,一旦发现其他线程已经修改了集合,迭代器会抛出ConcurrentModificationException,这就是快速失败机制。 9. **遍历集合**: - 可以使用for-each循环、...

    Java用for循环Map详细解析

    1. 遍历过程中不要修改`Map`,因为这可能导致迭代器抛出`ConcurrentModificationException`。 2. 使用`keySet()`或`entrySet()`而不是`values()`,因为`values()`只返回值的`Collection`视图,无法直接访问键。 3. ...

    Java集合容器面试题

    Java集合的快速失败机制 “fail-fast”是指:当集合正在被遍历时,如果集合发生了变化,遍历器将抛出ConcurrentModificationException。 怎么确保一个集合不能被修改 怎么确保一个集合不能被修改?使用Collections...

    Java集合多线程安全.docx

    例如,在多个线程同时尝试修改列表时,可能会抛出`ConcurrentModificationException`。 2. `LinkedList`:与`ArrayList`类似,其迭代器也不是线程安全的,因此并发修改会导致异常。 3. `HashMap`:并发写入可能导致...

    02-Java集合容器面试题(2020最新版)-重点.pdf

    - 当多个线程并发访问集合时,如果其中一个线程修改了集合结构,则其他正在访问该集合的线程会抛出`ConcurrentModificationException`异常,这就是快速失败机制。 #### 十、确保集合不可被修改 - **方法**:可以...

    Java Collections集合继承结构_动力节点Java学院整理

    在使用`Iterator`或`ListIterator`遍历集合时,需要注意不要在迭代过程中直接修改集合,否则可能会抛出`ConcurrentModificationException`异常。 此外,Java集合框架还包括`Map`接口,它用于存储键值对。`Map`接口...

Global site tag (gtag.js) - Google Analytics