在 Java 中,遍历 Hashtable
(或其现代替代品 HashMap
)有多种方式,以下是 6 种常用方法的详细说明和代码示例:
1. 使用 keySet()
+ 增强 for 循环
Hashtable<String, Integer> table = new Hashtable<>();
// 添加数据...
for (String key : table.keySet()) {
Integer value = table.get(key);
System.out.println(key + " => " + value);
}
-
特点:先获取所有键,再通过键取值
-
性能:适用于少量数据(每次
get(key)
需哈希计算)
2. 使用 entrySet()
+ 增强 for 循环(推荐)
for (Map.Entry<String, Integer> entry : table.entrySet()) {
System.out.println(entry.getKey() + " => " + entry.getValue());
}
-
特点:直接获取键值对,效率最高
-
原理:
Entry
对象已包含键和值的引用
3. 使用 Iterator
迭代器
Iterator<Map.Entry<String, Integer>> it = table.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Integer> entry = it.next();
System.out.println(entry.getKey() + " => " + entry.getValue());
// it.remove(); // 可安全删除当前元素
}
-
特点:支持遍历时删除元素(
remove()
) -
场景:需要边遍历边修改集合时使用
4. 使用 forEach()
+ Lambda(Java 8+)
table.forEach((key, value) -> {
System.out.println(key + " => " + value);
});
-
特点:代码简洁,函数式风格
-
原理:内部仍基于
entrySet()
5. 使用 Enumeration
(传统方式)
Enumeration<String> keys = table.keys();
while (keys.hasMoreElements()) {
String key = keys.nextElement();
Integer value = table.get(key);
System.out.println(key + " => " + value);
}
-
特点:
Hashtable
特有,HashMap
不支持 -
注意:性能低于
entrySet()
6. 并行遍历(Java 8+)
table.entrySet().parallelStream().forEach(entry -> {
System.out.println(entry.getKey() + " => " + entry.getValue());
});
-
特点:多线程并行处理大数据量
-
注意:线程安全问题需自行保证
方法对比总结
方法 | 是否线程安全 | 能否修改集合 | 性能 | 适用场景 |
---|---|---|---|---|
keySet() + for | 是 | 否 | 中 | 简单遍历 |
entrySet() + for | 是 | 否 | 高 | 推荐常规使用 |
Iterator | 是 | 是 | 高 | 需要删除元素时 |
forEach() | 是 | 否 | 高 | Java 8+ 简洁代码 |
Enumeration | 是 | 否 | 低 | 遗留代码兼容 |
parallelStream | 否 | 否 | 可变 | 大数据量并行处理 |
最佳实践建议
-
单线程推荐:
// 写法简洁且性能最优
map.entrySet().forEach(entry -> { // 操作entry.getKey()和entry.getValue() });
需要删除元素时:
Iterator<Map.Entry<K,V>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<K,V> entry = it.next(); if (需要删除) { it.remove(); // 安全删除 } }
线程安全场景:
-
使用
ConcurrentHashMap
代替Hashtable
-
遍历时仍需外部同步(或使用其内置安全迭代器)
-