在 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
-
遍歷時仍需外部同步(或使用其內置安全迭代器)
-