我有一个带有值的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循环将反复产生相同的结果,前提是不正确的映射不会改变(I不要打电话,删除)。
答案 0 :(得分:0)
如果要按照放置密钥的顺序检索,请使用LinkedHashMap。
答案 1 :(得分:0)
不,你不是。但您可以使用LinkedHashMap
(http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html),然后您将得到保证。
答案 2 :(得分:0)
LinkedHashMap 用于addn(put)的顺序, TreeMap (界面SortedMap)用于键的顺序。
答案 3 :(得分:0)
不幸的是,HashMap的文档声明keySet()
方法没有返回SortedSet
,它只返回Set
,但订单无法保证。
特别是读取:它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。
答案 4 :(得分:0)
除非您使用HashMap实现可以为您提供此保证的自定义设置,否则您无法保证具体订单。 HashMap的 Set 为您提供了一个 Iterator()方法,该方法迭代“ no specific order ”中的元素。
阅读java文档:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Set.html#iterator()
如果您希望保证元素通过按顺序(即升序)进行迭代,请使用实现 SortedMap 的内容,例如 TreeMap
TreeMap文档:http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html
在此页面上,您可以找到 getSet()方法,其中显示“ set的迭代器按升序返回键”。