Map 集合
快速遍历 Map
方式一:使用 entrySet() 与 forEach 循环
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
方式二:使用 keySet() 与 forEach 循环
for (String key : map.keySet()) {
System.out.println("Key: " + key + ", Value: " + map.get(key));
}
方式三:使用 forEach 与 Lambda 循环
map.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));
方式四:使用迭代器与 entrySet() 或 keySet()
Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
Iterator<String> keyIterator = map.keySet().iterator();
while (keyIterator.hasNext()) {
String key = keyIterator.next();
System.out.println("Key: " + key + ", Value: " + map.get(key));
}
方式五:使用 Stream() 流 API
map.entrySet().stream()
.forEach(entry -> System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()));
// 或者并行流(大数据量时可能提升性能)
map.entrySet().parallelStream()
.forEach(entry -> System.out.println("[Parallel] Key: " + entry.getKey() + ", Value: " + entry.getValue()));
HashMap 实现原理
HashMap 在 JDK 1.7 及以前底层数据结构采用数组加链表的形式。当你需要添加一个键值对时,它会计算 key 的哈希值,再通过一定的运算(hash & (数组长度 - 1),其实就是 hash % 数组长度,不过位运算的速度快)来确定要添加到数组的哪个索引位置。确定数组索引位置后,看该数组槽位是否为空,如果为空,那么直接在该槽位中创建一个 Entry 对象存入要添加的键值对和 key 计算出的哈希值和下一个引用位置,并且将 HashMap 的修改次数加一。那么如果不为空,则会使用链表进行链接(头插法)在同一个哈希桶中(限制:链表过长,查询时间效率为 O(n))。


