2012-06-16 236 views
9

链接HashMap LIFO或FIFO的性质? 如果我的地图的形式是 - >LinkedHashMap LIFO或FIFO?

map.put(1,"one"); 
map.put(2,"two"); 

会是什么,如果我是遍历使用键集地图上的顺序?

编辑:我想我确实混淆了两个不同的概念。我重新说明了这个问题。我会遇到使用入门集的数量的顺序是什么?谢谢指出,btw.i无意删除任何条目。

+0

Upvoted,因为我认为downvote是没有根据的 – Dancrumb

+0

它是'最后进入',但取决于您的使用情况可以从任何地方删除。 –

回答

11

在链接散列映射中,在末尾添加了后备双链表中的元素(显然:用于保留迭代顺序),但可以从元素从映射中移除时从列表中的任何部分移除,将后备列表(以及扩展名:地图)标记为LIFO或FIFO是不正确的 - 它们都不是 - 在地图中没有删除顺序的概念,因此链接的哈希中的后备列表不会有任何删除顺序地图。

什么是链接哈希映射确实保证是遍历它的内容(不管它:键或条目)将按照相同的顺序发生在元素插入映射;从documentation

该实现不同于HashMap,因为它维护一个双向链接列表运行通过它的所有条目。这个链表定义了迭代排序,这通常是键被插入映射的顺序(插入顺序)。

编辑:

关于上次编辑的问题,一个LinkedHashMap保证keySet()的迭代顺序将在该元素被插入相同的顺序:1, 2为示例在问题中。这与FIFO/LIFO无关,这些概念处理元素从数据结构中移除的顺序,并且在插入元素后它们与迭代顺序无关。

+0

downvoter,谨慎解释? –

+0

(1)LinkedHashMap中的顺序被定义为插入顺序,因此(2)排序的概念确实存在,并且(3)关于“移除顺序”的问题中没有任何内容,无论可能如何。现在,您在编辑中添加的第二段与第一段相矛盾。 – EJP

+1

@EJP LIFO表示删除操作发生时,添加的最后一个元素将是第一个_removed_。 FIFO表示删除操作发生时,第一个添加的元素将是第一个_removed_。所以你看,LIFO/FIFO与去除有关,一切都与迭代或排序有关,OP会混淆不同的概念,你也是如此。 –

5

LinkedHashMap引用的javadocs是“Map接口的哈希表和链表实现,具有可预测的迭代顺序”。因此,keySet将基于插入顺序返回密钥,基本上是FIFO。

1

根据Java文档,如果您要遍历映射,键集将按插入顺序排列。所以你得到的第一个键是输入的第一个键,而不是现有的键。请注意,重新插入键值对不会更改原始键位置。

1

当没有使用访问顺序时(标准情况),您可以将LHM视为一个链接列表,通过键快速访问O(1)。

在这方面,当访问顺序未使用时,它是FIFO(查看c-tors)。当使用访问订单时,如果有任何get()操作对订单进行重新排序,则放置订单无关紧要。看看protected boolean removeEldestEntry(Map.Entry<K,V> eldest)老大= FIFO。

本质上,LHM是一个很好的双向链表,其中Map.Entry<Key, Value>带有散列索引。 我自己从来没有在当前的impl中使用vanilla HashMap。它与LHM相比几乎没有什么好处 - 内存占用少,但可迭代次数很多。 Java8(或9)也许可能会最终修复HashMap,希望Doug Lea能够推动他的impl。