LinkedHashMap中的entrySet()是否也保证顺序?


70

我正在使用一个linkedHashMap来保证有人尝试访问它时的顺序。但是,当需要进行迭代时,使用entrySet()返回键/值对是否也可以保证顺序?迭代时不会进行任何更改。

编辑:另外,通过迭代其键并调用get可以遍历地图是否有任何不利影响?


我本来也要问同样的问题,但是如果有人已经问过并得到很好的回答,为什么还要问呢?+1是一个好问题。
uTubeFan 2012年

在LinkedHashMap中,您可以使用插入顺序和访问顺序。订单始终保持不变。请介绍我的LinkedHashMap教程的内部生活
Volodymyr Levytskyi

Answers:


54

根据Javadocs的说法,是的。

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

至于编辑,不,它应该可以正常工作。但是,由于避免了在迭代过程中查找映射中的每个键的开销,因此入口集的速度有所提高。


15
但是entrySet返回一个本身无序的Set?
乔纳森。

6
是的,从技术上讲,entrySet本身无法访问头寸,但entrySet.iterator()可以。迭代器让我们有一个有序列表。
Jpatrick '16

3
我想知道这个答案是正确的,但是正如乔纳森(Jonathan)指出的那样,它entrySet()返回一个Set。Jpatrick说,集合的迭代器使我们有一个有序列表,但是docs.oracle.com/javase/6/docs/api/java/util/Set.html#iterator()说:“元素的返回顺序没有特定的顺序(除非该集合是提供保证的某些类的实例。” 并且这里引用的所有文档都没有说entrySet()返回Set,它是保证顺序的类的实例。我想念什么吗?
LarsH

1
Michael Myers指出指出LinkedHashMap定义了迭代顺序的文档是正确的,但没有说明如何访问该顺序。entrySet().iterator()是一个合理的方法,但是可以依靠吗?
LarsH

5
在这里找到了明确的答案:stackoverflow.com/a/2924143/423105 “地图的顺序定义为地图的集合视图上的迭代器返回其元素的顺序。” Map
-javadoc

1

此链表定义了迭代顺序,通常是将键插入映射的顺序(插入顺序)。请注意,如果将密钥重新插入到映射中,则插入顺序不会受到影响。(如果在调用之前m.containsKey(k)将立即返回true,则调用m.put(k,v)时,将密钥k重新插入到映射m中。)


1

如果您确定在迭代过程中不会进行任何更改,则entrySet()可以保证按API所述正确排序。


2
您链接到的API文档entrySet()没有说明保证适当的顺序。该页面上唯一相关的陈述是“此类[即HashMap]不保证地图的顺序;特别是,它不能保证顺序随时间保持不变。” 您通过该链接指的是什么?
LarsH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.