LinkedHashMap LIFO还是FIFO?

问题描述 投票:11回答:4

LinkedHashMap是LIFO还是FIFO的性质?如果我的地图是形式 - >

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

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

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

java data-structures fifo linkedhashmap
4个回答
13
投票

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

链接散列映射确实保证迭代其内容(无论是:键还是条目)将按照在映射中插入元素的顺序进行;来自documentation

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

编辑:

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


5
投票

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


1
投票

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


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能够推动他的推动。

© www.soinside.com 2019 - 2024. All rights reserved.