LinkedHashMap的keySet()和values()方法的行为

7

可能重复:
LinkedHashMap对象的keySet()返回顺序是否有保证?

假设我创建了一个LinkedHashMap对象,如下所示:

Map<String, String> map = new LinkedHashMap<String, String>();
map.put("a", "aa");
map.put("b", "bb");
map.put("c", "cc");

当我调用 keySet(),它是否会给我一个有序的集合?如果我调用 values(),这些值也是有序的吗? 编辑 抱歉,我的意思是有序的,而不是已排序的。

1
这不是用 Java Doc 编写的合同。它只保证了一个 Set 接口。 - Nishant
3
为什么不使用“天行者,使用源代码”的资源(http://javasourcecode.org/html/open-source/jdk/jdk-6u23/java.util/LinkedHashMap.java.html)? - DNA
@DNA,你提供的链接现在已经失效了 :( - GreenGiant
@GreenGiant 谷歌是你的好朋友;-) 试试这个链接吧。 - DNA
2个回答

8
首先,LinkedHashMap是有序的但不是排序的。TreeMap是排序的(因此也是有序的)。
话虽如此,您不能期望keySet()和values()的输出是排序的。实际上,JavaDoc没有提到这些集合的顺序(事实证明,JavaDoc保证了LinkedHashMap对象返回键和值的顺序:Is the order guaranteed for the return of keys and values from a LinkedHashMap object?),但查看实现后,它们应该遵循底层Map的顺序。
针对您问题的最近编辑:这不是契约的一部分,实际上LinkedHashMap甚至没有实现keySet()和values(),而是使用基类(HashMap)的版本。即使根据实现可以看到顺序被保留,如果要使应用程序可移植,您也不应依赖它。

1
请查看此问题的已接受答案:https://dev59.com/YXA85IYBdhLWcg3wJf8Z - Arne Evertsson
@ArneEvertsson:+1,谢谢,我已经更正了我的答案。实际上,我将这个问题标记为重复。 - Tomasz Nurkiewicz

2

当检索键集或值时,您不会得到SortedSet或排序集合。但是,返回的实现使用映射的键/值迭代器,因此在foreach循环中使用时,将按插入顺序返回值。

因此,您获得由LinkedHashMap定义的顺序,但不能认为它是有序的(也无法重新排序这些集合)。


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