哪个Map最适合用来实现LRU Cache?

william_yao 2013-12-18 10:48:26
前段时间面试碰到的一道题,最近进了这家公司了,再拿出来看看。求大神继续解脱。

30. 下面哪个Map最适合用来实现LRU Cache?
A. Hashtable
B. TreeMap
C. HashMap
D. IdentityHashMap
E. WeakHashMap

网上给的答案是A。为什么?
大家一般如何实现这个 最近最少使用 cache?
...全文
932 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
guishuanglin 2013-12-30
  • 打赏
  • 举报
回复
如果只有上面的选择,我选择: HashMap ,理由: 1 LinkedHashMap 是 HashMap的子类. 2 LinkedHashMap 明确说明 "很适合构建 LRU 缓存", 实现了"从近期访问最少到近期访问最多的顺序". 所以: 如果用 hashMap自己实现 "MyLinkedHashMap " 用来构建 LRU 更实际.
Inhibitory 2013-12-29
  • 打赏
  • 举报
回复
LRU需要删除最近最少使用的元素,也就是说,需要排序功能找出最近最少使用的那个元素,所提供的几个选项里只有TreeMap适合。
raistlic 2013-12-29
  • 打赏
  • 举报
回复
A. Hashtable B. TreeMap C. HashMap D. IdentityHashMap E. WeakHashMap 首先可以确定 E 不对 D 我没用过就不乱说了 A 不合适,不说有更好的 ConcurrentHashMap,也不说 Hashtable 这个类本身已经被认为过时了,单从设计的角度来说,它本身不管三七二十一先加了锁,限制了你设计上的灵活度,或者说你设计上很可能不需要它这种加锁方式。 Hashtable 这种类,说它“线程安全”,它真的安全吗? C HashMap 比 A 好,因为要想像 A 那样加锁,你随时可以用 Collections.synchronizedMap(map) 把你的 map 保护起来,HashMap本身不是线程安全的,正因为这样,你可以用任何最合适的方式来保护它,以实现线程安全。 比较一下 A 和 C,C 是块漂亮的好砖,可以拿来盖房子,铺地板,怎么都好用,因为它不多管闲事;A 是快自作聪明的坏砖,它身上先自己抹了水泥,——你有六面你知道我需要你哪一面抹水泥? B 从效率上说,应该不如 C 合适。
william_yao 2013-12-26
  • 打赏
  • 举报
回复
引用 8 楼 xiongweiyu88 的回复:
LinkedHashMap 双向链表
能不能详细阐述下原因?这样的回答make no sense哦。
xiongweiyu88 2013-12-26
  • 打赏
  • 举报
回复
LinkedHashMap 双向链表
wangzhidavl 2013-12-20
  • 打赏
  • 举报
回复
因为hashmap的实现原理是 表(数组)+链表的形式来实现的,当查找一个key时,先计算hashcode,得到对应该的entry<K,V>,entry是链表结构,调用其next方法逐个entry来跟k比较,最终取得value。 如果再次查找同一个key,就只计算hashcode即可取得value,因为在上次取的时候已经把entry 的链表指针指向了这个value
guishuanglin 2013-12-19
  • 打赏
  • 举报
回复
是的,我觉得LinkedHashMap很合适, 这个本来在jdk 说明中就有说可以用做 lru的原始说明的. 你可以查api
william_yao 2013-12-19
  • 打赏
  • 举报
回复
引用 3 楼 guishuanglin 的回复:
连表HashMap最合适, 可以修正排序位置.
LinkedHashMap么?
guishuanglin 2013-12-19
  • 打赏
  • 举报
回复
连表HashMap最合适, 可以修正排序位置.
sjlzcj 2013-12-19
  • 打赏
  • 举报
回复
你这个 重点是 cache 既然是cache 就一定要注意“容器”的线程安全方面的东西 lru是你cache的实现算法, 算法实现上 要先保证数据的正确性,,再考虑性能 所以,,,就像我在2#回复的一样了
UDown 2013-12-19
  • 打赏
  • 举报
回复
LRU缓存介绍与实现,平时很少用到
sjlzcj 2013-12-18
  • 打赏
  • 举报
回复
就那几个可选的来说 只能是A了 因为是线程安全的 不过 个人认为应该用 Map map = Collections.synchronizedMap(new LinkedHashMap());

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧