通过 entryset() 高效遍历 hashmap 的核心做法是调用 map.entryset().iterator() 获取迭代器,并在循环中直接通过 iterator.next() 获取 map.entry 对象,随后分别调用 getkey() 和 getvalue()。这种方式避免了在每次循环中重复调用 get(key) 带来的哈希查找开销,同时不需要像 keyset() 那样额外创建键的集合副本,从而实现了时间与空间上的双重优化。

为什么 entrySet 比 keySet 更快
entrySet() 返回的是视图集合,其迭代器直接指向底层数组中的节点,而 keySet() 需要为每个键生成一个包装对象并单独进行查找。使用 entrySet 可以在一次访问中同时拿到键值对,消除了二次寻址的成本。

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class EntrySetDemo {
public static void main(String[] args) {
Map<string integer> map = new HashMap();
map.put("A", 1);
map.put("B", 2);
// 高效遍历方式
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>
如何安全地在遍历时移除元素
在遍历过程中如果需要删除元素,必须使用迭代器提供的 remove() 方法,而不能直接调用 map.remove(),否则会导致 ConcurrentModificationException。这是保证线程一致性(在单线程上下文中指结构修改计数一致)的关键操作。

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class SafeRemoveDemo {
public static void main(String[] args) {
Map<string integer> map = new HashMap();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
Iterator<map.entry integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<string integer> entry = it.next();
if ("B".equals(entry.getKey())) {
it.remove(); // 安全移除
}
}
System.out.println(map); // 输出 {A=1, C=3}
}
}</string></map.entry></string>
entrySet 内部数据结构与性能表现
entrySet() 返回的集合实际上是 HashMap 内部维护的一个静态内部类 EntrySet 的实例。该集合的迭代器直接复用底层的 HashIterator,因此它不会在遍历时复制任何数据。对于包含大量数据的 HashMap,这种零拷贝的设计显著降低了内存占用和 GC 压力。相比之下,如果使用增强 for 循环配合 keySet(),虽然语法简洁,但每次循环都会触发一次 get() 操作,这在哈希冲突较多或负载因子较高时性能下降明显。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











