Java 为什么';LinkedHashMap是否提供索引访问?

Java 为什么';LinkedHashMap是否提供索引访问?,java,linkedhashmap,Java,Linkedhashmap,来自Javadoc: 映射接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashMap的不同之处在于,它维护一个贯穿其所有条目的双链接列表。 如果是这样的话,那么为什么它不能像java中的List那样提供对象访问呢, list.get(索引) 更新 我已经使用LinkedHashMap实现了LRU缓存。我的算法要求我从缓存访问LRU对象。这就是为什么我需要随机访问,但我认为这会让我损失糟糕的性能,所以我更改了逻辑,在缓存已满的情况下访问LRU对象…使用RemoveEdestEntry()

来自Javadoc:
映射接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashMap的不同之处在于,它维护一个贯穿其所有条目的双链接列表。

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

更新

我已经使用LinkedHashMap实现了LRU缓存。我的算法要求我从缓存访问LRU对象。这就是为什么我需要随机访问,但我认为这会让我损失糟糕的性能,所以我更改了逻辑,在缓存已满的情况下访问LRU对象…使用RemoveEdestEntry()

谢谢大家……

a)因为这些条目是链接的,不是随机访问的。如果我没有出错,性能会很糟糕,
O(N)

b)因为没有接口来备份此功能。因此,我们可以选择要么为这个(性能差的)实现引入专用接口,要么要求客户机根据实现类而不是接口进行编程


顺便说一句,这里有一个简单的解决方案:

Iterables.get(map.values(), offset);

对于缓存,请查看Guava及其过期功能。

它提供了一个
迭代器接口,列表中的每个节点都链接到它之前和之后的节点。拥有
get(i)
方法与迭代列表中的所有元素没有什么不同,因为没有支持数组(与
LinkedList
相同)

如果您需要这种性能不是很好的功能,我建议您自己扩展映射

请查看

,因为
values()
提供了值的支持集合,您可以这样解决它:

map.values().remove(map.values().toArray()[index]);
也许效率不是很高(特别是内存方面),但它应该是
O(N)
,正如您所期望的那样


顺便说一句,我认为这个问题对于所有
List
操作都是合理的。(无论如何,它不应该比
LinkedList
慢,对吧?)

我开始做一个
LinkedHashMapList
,它扩展了
LinkedHashMap
并实现了
List
接口。令人惊讶的是,这似乎是不可能做到的,因为冲突的删除。现有的
remove
方法返回先前映射的对象,而
List.remove
应返回一个
布尔值


这只是一种反映,老实说,
LinkedHashMap
不能像
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];
Map Map=newlinkedhashmap();
Map.Entry[]entries=(Map.Entry[])Map.toArray(new Map.Entry[Map.size());
Map.Entry\u n=条目[n];
如您所见,除非缓存
条目
数组,否则性能可能非常差


然而,我怀疑是否需要它。

制作一个具有按索引访问的log(N)效率的地图并没有真正的问题。如果使用红黑树并为每个节点存储从该节点开始的树中元素的数量,则可以编写一个名为log(N)的get(int index)方法

所以,在链表中,每当我们访问最后一个元素list.get(list.size()-1)时,它是随机访问还是O(n)(所有元素都是迭代的)?
它提供了一个不正确的迭代器接口。映射的entrySet()提供了迭代器,而不是映射本身(除此之外,您是对的)@ternalnoob这是一条老评论,但对于未来的读者来说,值得回答您的老问题:
LinkedList
知道它的大小,当您访问高于列表一半的元素索引时,它将向后迭代。因此,访问最后一个元素和访问第一个元素一样便宜。只有中间的元素有迭代的代价。知道这些自定义集合很好,但是它们很少有用。如果您需要它们,您的代码中通常会有一个设计缺陷:-)当您在ApacheCommons周围搜索时,要获取lru映射,请尝试LRUMap。谢谢Sean。我正在使用LinkedHashMap来实现LRU缓存…并且想要一些功能来查看LRU对象…但是我想在map上迭代会有非常糟糕的性能…你知道这种功能的其他数据结构吗?+1,回答很好。但是,应该注意的是,它不会比LinkedList提供的性能差,比如说,
LinkedList
,所以我真的看不出这个论点。@Enternal Noob,它在文档中说:这种映射非常适合构建LRU缓存,并且,在映射上进行迭代是非常有效的(O(n))@aioobe这就是为什么LinkedList不实现随机访问的原因是,我也看到了。。。LinkedHashMap的remove()方法来自HashMap,因为LinkedHashMap扩展了HashMap…这与List的remove()相冲突…这似乎没有回答问题。