Java的LinkedHashMap是否保持键的顺序?

44
当调用LinkedHashMap.keySet()方法时,返回的Set集合中键的顺序是否与它们添加的顺序相同?

对于那些来自PHP的人,让我指出LinkedHashMap的行为非常类似于PHP数组。 - Walter Tross
2个回答

51

是的。

详见:LinkedHashMap

这个链表定义了迭代顺序,通常是按照键被插入到映射中的顺序(插入顺序)。

并且从HashMap#keySet文档中可以看出:

返回的集合由映射支持,因此对映射的更改会反映在集合中,反之亦然。


4
@Tom谢谢,我仍然不确定这是显式的。为什么LinkedHashMap.keySet()不会返回一个带有固定排序的Set子类呢? - Armand
5
如果返回一个SortedSet,那么LinkedHashMap就会增加这样的要求:它的键必须是实现了Comparable接口的类型,或者必须提供一个比较器函数。而Map并不需要满足这个要求。请查看SortedSet文档:http://download.oracle.com/javase/6/docs/api/java/util/SortedSet.html。不需要这个要求可以让没有实现Comparable接口的键也能在LinkedHashMap中使用,这是更一般的情况。如果LinkedHashMap的键具有可比性,它的实现甚至可能会返回一个SortedSet,但这并非是必需的。 - Tom Tresansky
2
@Tom 确切地说 - 你要求一个有序的 Set,但它没有实现 SortedSet,我提供了一个例子。 - Armand
4
谢谢,有价值的信息。我在想这是否在未来会发生改变,并且它是否取决于Java实现(例如Oracle与其他公司)? - Armand
2
“...which is normally the order...” 不是非常精确(它可能意味着有时是随机的!)。LinkedHashMap javadoc 中重要的一行在开头句子中:“具有可预测的迭代顺序”。 - bacar
显示剩余8条评论

40

是的。唯一的例外是,当一个键被重新插入时,它会按照它最初插入到列表中的顺序出现。


4
在那个边角案例上,你做得很好。+1 - Tom Tresansky
5
实际上,这个例外情况是针对当关键词被重新插入而不是被删除并重新使用的情况。当你为已经存在于地图中的关键词调用put(key, value)时,就会出现这种情况。(Java文档已经清楚地解释了这一点。) - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接