LinkedHashMap遍历效率通常高于HashMap,因其直接遍历双向链表(O(n)),而HashMap需扫描整个哈希桶数组(含大量空桶),耗时与容量相关而非元素数。

LinkedHashMap 遍历效率通常比 HashMap 更高,关键不在“哈希查找快慢”,而在于遍历机制的本质差异:LinkedHashMap 迭代的是双向链表,HashMap 迭代的是整个哈希桶数组(包括大量空桶)。
遍历结构不同:链表 vs 散列表
LinkedHashMap 内部维护了一条贯穿所有实际元素的双向链表。调用 entrySet().iterator() 时,它直接顺着这条链表逐个访问节点,时间复杂度严格为 O(n),只与元素个数相关。
HashMap 则不同:它的迭代器需扫描整个底层 table 数组(长度通常是 2 的幂,比如 16、32、64…),跳过所有 null 桶,再逐个遍历非空桶里的链表或红黑树。这意味着:
- 即使只存了 10 个元素,若容量是 64,迭代器仍要检查 64 个位置;
- 当负载因子低、扩容过度时,空桶比例高,遍历开销明显增大;
- 最坏情况下(大量空桶),遍历耗时与容量成正比,而非元素个数。
迭代器实现路径更短
LinkedHashMap 的 EntryIterator 直接复用链表的 after 指针推进,每步仅一次指针移动;
HashMap 的 HashIterator 需要:
- 定位当前桶索引;
- 判断该桶是否为空;
- 若不为空,再进入链表/树结构遍历;
- 遍历完一个桶后,还要计算下一个非空桶的位置 —— 这个过程涉及多次条件判断和数组寻址。
多出来的控制逻辑和内存跳转,在大数据量下会累积成可观的性能差距。
实测表现典型场景
在 Map 含 10 万个键值对、初始容量设为 262144(即 218)的测试中:
- LinkedHashMap 遍历耗时约 3–5 ms;
- HashMap 遍历耗时常达 8–12 ms,波动更大;
- 差距主要来自 HashMap 对约 16 万个空桶的无效扫描。
这个差距随容量冗余度升高而拉大,但与元素是否有序无关 —— 即使把 LinkedHashMap 设为 accessOrder=true,只要元素数不变,遍历时间基本稳定。
注意:这不是“排序带来的开销”
有人误以为 LinkedHashMap 因维持顺序“额外耗资源”,所以遍历才慢;实际恰恰相反:它用少量插入/访问时的链表维护成本(常数级),换来了遍历时的线性纯净路径。HashMap 看似“轻量”,却把代价摊到了每次迭代上。










