为什么LinkedHashMap不提供索引访问?

Ete*_*oob 12 java linkedhashmap

来自Javadoc:
Hash table and linked list implementation of the Map interface, with predictable iteration order. This implementation differs from HashMap in that it maintains a doubly-linked list running through all of its entries.

如果是这样,那么为什么它不提供像java中的List那样的对象访问,list.get(index);

UPDATE

我使用LinkedHashMap实现了LRU Cache.我的算法要求我从缓存中访问LRU对象.这就是我需要随机访问的原因,但我认为这会让我失去性能,所以我改变了逻辑,我正在访问LRU对象就在Cache已满时...使用removeEldestEntry()

谢谢你们...

Sea*_*oyd 15

a)因为条目是链接的,不能随机访问.O(N)如果我没有错,那么表现会很糟糕.

b)因为没有用于备份此功能的接口.因此,选择是为此引入专用接口(性能不佳)或要求客户端针对实现类而不是接口进行编程


顺便说一下,Guava有一个简单的解决方案:

Iterables.get(map.values(), offset);
Run Code Online (Sandbox Code Playgroud)

对于缓存,请查看Guava MapMaker和它的到期功能.

  • +1,很好的答案.但是,应该注意的是,它不会比"LinkedList"提供的性能差,所以我真的没有看到这个论点. (3认同)

aio*_*obe 7

由于values()提供了值的后备集合,您可以像这样解决:

map.values().remove(map.values().toArray()[index]);
Run Code Online (Sandbox Code Playgroud)

也许不是很有效(特别是在记忆方面),但它应该O(N)像你期望的那样.


顺便说一句,我认为这个问题对所有List操作都是合法的.(它不应该比LinkedList任何时候慢,对吧?)

我开始做一个LinkedHashMapList扩展LinkedHashMap和实现List接口的方法.令人惊讶的是,由于删除冲突,似乎无法做到.现有remove方法返回先前映射的对象,而List.remove应返回a boolean.

这只是一个反思,老实说,我也觉得烦人的是,LinkedHashMap不能把它当作一个更好的对待LinkedList.