java 中通过调用 set 接口的 iterator() 方法获取迭代器,随后使用 hasnext() 判断是否有元素以及 next() 获取下一个元素来完成遍历。该方法返回的迭代器遵循 set 集合不重复且无序(针对 hashset)或有序(针对 treeset)的特性,遍历时会按内部存储顺序依次访问每个对象。

Iterator 在遍历过程中移除元素会发生什么
如果在遍历过程中直接调用 Set 实例的 remove() 方法删除元素,会抛出 ConcurrentModificationException 异常。这是因为 Set 的实现类(如 HashSet)维护了一个名为 modCount 的字段来记录结构修改次数,而迭代器在创建时会保存当时的 modCount 值。每次调用 next() 时,迭代器都会检查当前的 modCount 是否与保存的值一致,如果不一致则说明发生了非预期的并发修改。正确的做法是使用迭代器自身的 remove() 方法,该方法会在删除元素的同时更新迭代器内部的预期修改计数,从而避免异常。

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class IteratorRemoveExample {
public static void main(String[] args) {
Set<string> set = new HashSet();
set.add("A");
set.add("B");
set.add("C");
// 正确做法:使用迭代器的 remove() 方法
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>
遍历 HashMap 的 EntrySet 时如何高效获取键值对
当需要同时获取 HashMap 中的键和值时,可以通过调用 entrySet().iterator() 获取迭代器,并在循环中使用 Map.Entry 对象的 getKey() 和 getValue() 方法分别提取数据。这种方式比先获取 Key 的迭代器再通过 get(key) 查找 Value 更高效,因为后者需要在哈希表中重新进行查找操作,而前者直接在内存中读取已关联的键值对对象。

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class MapEntryIteratorExample {
public static void main(String[] args) {
Map<string integer> map = new HashMap();
map.put("Apple", 1);
map.put("Banana", 2);
// 高效遍历 EntrySet
Iterator<map.entry integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<string integer> entry = it.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " : " + value);
}
}
}</string></map.entry></string>
使用 Iterator 遍历 Set 时如果发生并发修改会触发哪个异常
在使用 Iterator 遍历 Set 的过程中,如果通过 Set 对象本身的方法(如 add、remove)修改了集合的结构,会立即触发 java.util.ConcurrentModificationException。这是 Java 集合框架提供的快速失败(fail-fast)机制,旨在帮助开发者尽早发现代码中的并发修改错误。该异常在调用 next() 时被检测到并抛出,而不是在修改操作发生时立即抛出,因此必须在迭代逻辑中妥善处理或使用线程安全的集合类如 CopyOnWriteArraySet。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











