为什么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); 更新 我已经使用LinkedHashMap实现了LRU Cache。我的算法要求我从缓存访问LRU对象。这就是为什么我需要随机访问,但是我认为这会降低性能,因此我更改了逻辑,仅在缓存已满时才访问LRU对象...使用removeEldestEntry() 谢谢你们...     
已邀请:
a)因为条目是链接的,所以不能随机访问。如果我没记错的话,演奏会很糟糕,ѭ1。 b)因为没有接口来备份此功能。因此,选择是要么为此实现(性能很差)引入专用接口,要么要求客户端针对实现类而不是接口进行编程 顺便说一句,番石榴有一个简单的解决方案:
Iterables.get(map.values(), offset);
对于缓存,请查看Guava的
MapMaker
及其过期功能。     
由于
values()
提供了值的后备集合,因此可以这样解决:
map.values().remove(map.values().toArray()[index]);
也许效率不是很高(特别是在内存方面),但应该像您期望的那样为1。 顺便说一句,我认为这个问题对所有“ 7”运算都是合理的。 (无论如何它不应该慢于
LinkedList
,对吧?) 我开始进行a9扩展ѭ10并实现ѭ7implemented接口。令人惊讶的是,由于要删除,因此似乎无法执行。现有的
remove
方法返回先前映射的对象,而
List.remove
应返回
boolean
。 那只是一个反映,说实话,我也很讨厌10英镑不能像8英镑那样令人讨厌。     
请看一下Apache Commons LinkedMap     
它提供了一个“ 17”接口,列表中的每个节点都链接到该节点之前和之后的节点。使用
get(i)
方法与遍历列表中的所有元素没有什么不同,因为没有后备数组(与
LinkedList
相同)。 如果您需要的性能不是很好,我建议您自己扩展地图     
如果您想随机访问,可以这样做
Map<K,V> map = new LinkedHashMap<K,V>();
Map.Entry<K,V>[] entries = (Map.Entry<K,V>[]) map.toArray(new Map.Entry[map.size()]);
Map.Entry<K,V> entry_n = entry[n];
如您所见,除非您缓存
entries
数组,否则性能可能会很差。 但是,我会对此有疑问。     
制作具有索引访问效率log(N)的Map并没有真正的问题。如果使用一棵红黑树并为每个节点存储从该节点开始的树中元素的数量,则可以编写一个log(N)的get(int index)方法。     

要回复问题请先登录注册