在 java 中,通过 iterator 删除 hashset 元素必须使用迭代器自身的 remove() 方法。直接调用集合的 remove() 或在增强 for 循环中操作会导致 concurrentmodificationexception。使用 iterator.remove() 能安全地移除当前遍历到的元素并更新内部状态。

Iterator 如何定位并删除当前元素
迭代器在遍历时会维护一个指向当前元素的引用。当调用 remove() 时,它实际上是从底层的哈希表中移除该节点,并将迭代器的位置重置到上一个有效元素或头部,确保不会跳过后续元素。

import java.util.HashSet;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
HashSet<string> set = new HashSet();
set.add("A");
set.add("B");
set.add("C");
Iterator<string> it = set.iterator();
while (it.hasNext()) {
String item = it.next();
if (item.equals("B")) {
it.remove(); // 安全删除
}
}
System.out.println(set); // 输出: [A, C]
}
}</string></string>
为什么不能在增强 for 循环中直接删除
增强 for 循环底层就是使用 Iterator,但它隐藏了迭代器的获取过程。如果在循环体内直接调用 set.remove(),会修改集合的结构计数(modCount),而迭代器期望 modCount 保持不变,从而抛出异常。必须显式获取 Iterator 并调用其 remove 方法。

import java.util.HashSet;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
HashSet<string> set = new HashSet();
set.add("X");
set.add("Y");
set.add("Z");
// 错误示范:这会抛出 ConcurrentModificationException
// for (String s : set) {
// if (s.equals("Y")) set.remove(s);
// }
// 正确做法:显式使用 Iterator
Iterator<string> it = set.iterator();
while (it.hasNext()) {
if (it.next().equals("Y")) {
it.remove();
}
}
System.out.println(set); // 输出: [X, Z]
}
}</string></string>
删除后迭代器的状态变化
调用 remove() 后,迭代器不能再对刚才移除的元素再次调用 remove(),否则会抛出 IllegalStateException。同时,下一次调用 next() 将返回下一个元素,而不是被移除的那个。这保证了遍历的连续性和安全性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











