JavaScript中用Map实现LRU缓存可行,因其插入顺序可保持且所有操作平均O(1);get时delete再set以刷新位置,put时超容则删除keys().next().value对应项。

JavaScript 中用 Map 实现 LRU 缓存,核心在于利用其“插入顺序可保持”和“O(1) 查找/插入/删除”的特性,无需手动维护链表,逻辑简洁且高效。
Map 本身就能天然支持 LRU 的访问序
Map 的迭代顺序严格遵循键值对的插入顺序。每次 get 或 put 已存在 key 时,先 delete 再 set,就等效于“把该条目移到末尾”——这正是 LRU 所需的“最近使用置顶(尾部)”行为。而最久未使用的项自然留在 Map 的开头(keys().next().value)。
get 操作:命中即刷新位置
- 检查 key 是否存在;不存在则返回
null或-1 - 若存在,先
delete(key),再set(key, value),强制更新到 Map 末尾 - 最后返回对应 value
put 操作:插入或更新 + 容量控制
- 若 key 已存在:同样先
delete再set,完成值更新和位置刷新 - 若 key 不存在:直接
set(key, value) - 插入后检查
size > capacity;若超限,调用keys().next().value获取第一个 key,并delete它——即淘汰最久未用项
为什么不用双向链表也能达标?
因为 Map 在 V8 引擎中已内部优化为有序哈希表,keys()、values()、entries() 迭代器均按插入顺序返回,且所有基础操作平均时间复杂度为 O(1)。相比手写双向链表+Map 的双结构方案,纯 Map 实现更轻量、更少出错、更易维护,且完全满足题目要求的 O(1) 平均时间复杂度。










