0

我有一个带有值的 Map 并使用 Map.keySet 方法获取一个 Set。在这段代码中:

Map<String, String> map = new HashMap<>(); 
map.put("1", "a"); 
map.put("2", "b"); 
map.put("3", "c"); 
Set<String> set = map.keySet();

for (int i = 0; i < 5; i++) {
    for (String key : set) {
        System.out.println(key);
    } 
}

我能保证得到吗

1
2
3

每次都写出来?这个保证写在哪里?在 Javadoc 中?

编辑:实际上我并不关心插入顺序,但我关心这样一个事实,即在集合上使用 for-each 循环会一遍又一遍地产生相同的结果,前提是 undelying 映射不会改变(我不调用 put,remove)。

4

5 回答 5

0

如果要按照放置 key 的顺序进行检索,请使用LinkedHashMap 。

于 2013-03-05T10:22:43.477 回答
0

不,你不是。但是您可以使用LinkedHashMaphttp://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html),然后您将得到保证。

于 2013-03-05T10:23:06.220 回答
0

LinkedHashMap用于添加(放置)的顺序,而TreeMap(接口 SortedMap)用于键的顺序。

于 2013-03-05T10:24:16.200 回答
0

不幸的是,HashMap 的文档指出该keySet()方法不返回 a SortedSet,它只返回 a Set,不能保证其顺序。

参见HashMap.keySet()

尤其是阅读:它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。

于 2013-03-05T10:24:45.177 回答
0

不,您不能保证特定的顺序,除非您使用 HashMap 实现可以为您提供此保证的自定义集。Set the HashMap 为您提供了一个Iterator()方法,该方法以“无特定顺序”迭代元素。

阅读 java 文档:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Set.html#iterator()

如果您想要保证元素按顺序迭代,即升序,请使用实现SortedMap的东西,如TreeMap

树图文档:http ://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html

在此页面上,您可以找到getSet()方法,该方法显示“集合的迭代器按升序返回键”。

于 2013-03-05T10:48:21.110 回答