链接HashMap LIFO或FIFO的性质? 如果我的地图的形式是 - >LinkedHashMap LIFO或FIFO?
map.put(1,"one");
map.put(2,"two");
会是什么,如果我是遍历使用键集地图上的顺序?
编辑:我想我确实混淆了两个不同的概念。我重新说明了这个问题。我会遇到使用入门集的数量的顺序是什么?谢谢指出,btw.i无意删除任何条目。
链接HashMap LIFO或FIFO的性质? 如果我的地图的形式是 - >LinkedHashMap LIFO或FIFO?
map.put(1,"one");
map.put(2,"two");
会是什么,如果我是遍历使用键集地图上的顺序?
编辑:我想我确实混淆了两个不同的概念。我重新说明了这个问题。我会遇到使用入门集的数量的顺序是什么?谢谢指出,btw.i无意删除任何条目。
在链接散列映射中,在末尾添加了后备双链表中的元素(显然:用于保留迭代顺序),但可以从元素从映射中移除时从列表中的任何部分移除,将后备列表(以及扩展名:地图)标记为LIFO或FIFO是不正确的 - 它们都不是 - 在地图中没有删除顺序的概念,因此链接的哈希中的后备列表不会有任何删除顺序地图。
什么是链接哈希映射确实保证是遍历它的内容(不管它:键或条目)将按照相同的顺序发生在元素插入映射;从documentation:
该实现不同于HashMap,因为它维护一个双向链接列表运行通过它的所有条目。这个链表定义了迭代排序,这通常是键被插入映射的顺序(插入顺序)。
编辑:
关于上次编辑的问题,一个LinkedHashMap
保证该keySet()
的迭代顺序将在该元素被插入相同的顺序:1, 2
为示例在问题中。这与FIFO/LIFO无关,这些概念处理元素从数据结构中移除的顺序,并且在插入元素后它们与迭代顺序无关。
downvoter,谨慎解释? –
(1)LinkedHashMap中的顺序被定义为插入顺序,因此(2)排序的概念确实存在,并且(3)关于“移除顺序”的问题中没有任何内容,无论可能如何。现在,您在编辑中添加的第二段与第一段相矛盾。 – EJP
@EJP LIFO表示删除操作发生时,添加的最后一个元素将是第一个_removed_。 FIFO表示删除操作发生时,第一个添加的元素将是第一个_removed_。所以你看,LIFO/FIFO与去除有关,一切都与迭代或排序有关,OP会混淆不同的概念,你也是如此。 –
LinkedHashMap引用的javadocs是“Map接口的哈希表和链表实现,具有可预测的迭代顺序”。因此,keySet将基于插入顺序返回密钥,基本上是FIFO。
根据Java文档,如果您要遍历映射,键集将按插入顺序排列。所以你得到的第一个键是输入的第一个键,而不是现有的键。请注意,重新插入键值对不会更改原始键位置。
当没有使用访问顺序时(标准情况),您可以将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。
Upvoted,因为我认为downvote是没有根据的 – Dancrumb
它是'最后进入',但取决于您的使用情况可以从任何地方删除。 –