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