Java的LinkedHashMap是否维护密钥的顺序?

Arm*_*and 39 java map set linkedhashmap

调用LinkedHashMap.keySet()时,返回的Set的顺序是否与添加键的顺序相同?

Tom*_*sky 49

是.

请参阅:LinkedHashMap:

此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序).

并从HashMap#keySet文档:

集合[返回]由地图支持,因此对集合的更改将反映在集合中,反之亦然.

  • 因为如果它返回了一个SortedSet,那么LinkedHashMap将添加一个要求,即它的键是一个实现Comparable的类型,或者是一个比较器函数.Map不需要这样做.查看SortedSet文档:http://download.oracle.com/javase/6/docs/api/java/util/SortedSet.html.没有这个要求允许在LinkedHashMap中使用甚至不实现Comparable的键,这是更常见的情况.LinkedHashMap的实现甚至可以返回一个SortedSet,如果它的键是可比较的,但它根本不是必需的. (5认同)
  • @Roman谢谢,好消息.我想知道这是否会在将来发生变化,如果它可能依赖于Java实现(即Oracle与其他人相比) (4认同)
  • @Tom谢谢,我仍然不相信这是明确的.为什么LinkedHashMap.keySet()不会返回具有固定排序的Set的子类? (3认同)
  • @Tom完全 - 你要求一个没有实现`SortedSet`的有序`Set`,我提供了一个例子. (2认同)
  • @Alison如果查看源代码,它确实返回具有固定排序的Set的子类.HashSet的keySet()方法使用自定义的Set类来读取迭代器.LinkedHashMap会覆盖迭代器,以便从它自己的映射条目链表中读取.http://www.docjar.com/html/api/java/util/HashMap.java.html http://www.docjar.com/html/api/java/util/LinkedHashMap.java.html (2认同)
  • "......正常_秩序......"并不是非常精确(它可能意味着有时它是随机的!).来自LinkedHashMap javadoc的重要行在开头语句中:"with _predictable iteration order_". (2认同)

rel*_*let 38

是的.例外情况是,当重新插入密钥时,它将按照首次插入列表的顺序显示.

  • +1角球案的好抓. (4认同)
  • 实际上,例外情况是关键是**重新插入**,而不是删除和重用.这种情况是当你为地图中已经存在的键调用`put(key,value)`时.(javadoc清楚地解释了这一点.) (3认同)