LinkedHashMap LIFO还是FIFO?

时间:2012-06-16 18:38:41

标签: java data-structures fifo linkedhashmap

LinkedHashMap LIFO还是FIFO本质上? 如果我的地图的格式为 - >

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

如果我使用keyset在地图上迭代,那将是什么命令?

编辑:我认为我确实混淆了两个不同的概念。请重新解释一下这个问题。我使用entryset遇到数量的顺序是什么?感谢指出btw.i donot打算删除任何条目。

4 个答案:

答案 0 :(得分:12)

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

链接散列映射 保证的是迭代其内容(无论是:键还是条目)将以与映射中插入元素相同的顺序发生;来自documentation

  

这个实现与HashMap的不同之处在于它维护着一个运行所有条目的双向链表。此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。

编辑:

关于问题的最后一次修改,LinkedHashMap 保证 keySet()的迭代顺序与插入元素的顺序相同:{{ 1}}用于问题中的示例。这与FIFO / LIFO无关,这些概念处理从数据结构中删除元素的顺序,并且在插入元素后它们与迭代顺序无关。

答案 1 :(得分:5)

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

答案 2 :(得分:1)

根据Java文档,如果要迭代地图,则键集将按插入顺序排列。因此,您获得的第一个键是输入的第一个键,通过现有键。请注意,重新插入键值对不会更改原始键位置。

答案 3 :(得分:1)

当未使用访问顺序时(标准情况),您可以将LHM视为链接列表,非常快速地按键访问O(1)。

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

本质上,LHM是Map.Entry<Key, Value>的良好双向链表,其密钥上有哈希索引。 我自己从不使用香草HashMap作为其当前的impl。它与LHM相比几乎没有什么好处 - 更低的内存占用但是可怕的迭代。 Java8(或9)或许最终可能会修复HashMap,希望Doug Lea能够推动他的推动。