是否保证从LinkedHashMap对象返回键和值的顺序?

use*_*239 154 java iteration linkedhashmap

我知道LinkedHashMap有一个可预测的迭代顺序(插入顺序).是否Set通过返回LinkedHashMap.keySet()Collection返回的LinkedHashMap.values()也维持这种秩序?

Pow*_*ord 218

Map接口提供了三个 集合视图,允许将映射的内容视为一组键,值集合或键值映射集.该订单的地图被定义为其中在地图上的集合视图迭代返回元素的顺序.一些地图实现,比如TreeMap 类,对它们的顺序做出了特定的保证; 其他人,比如 HashMap班级,不这样做.

- 地图

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

- LinkedHashMap

所以,是的,keySet(),values(),和entrySet()顺序(三个集提到的观点)的返回值的内部链接列表使用.是的,JavaDoc for MapLinkedHashMap保证它.

毕竟,这就是本课程的重点.

  • 使用LinkedHashMap比使用HashMap更快地完成对地图的迭代. (7认同)
  • @Dejel`Collection`只是values()返回的基类.它返回的Collection的实现仍然由`LinkedHashMap`控制.在`LinkedHashMap`的情况下,它返回一个[`LinkedValues`](http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/LinkedHashMap .java#l584)实例,LinkedHashMap.java中的私有类. (7认同)
  • values()返回一个集合。不是列表。如何保持秩序? (2认同)
  • 在我的情况下,LinkedHashMap的键集不是按映射中表示的顺序。对此感到非常困惑。 (2认同)
  • 感谢您链接到文档(来自`Map`),该文档明确地将地图的顺序与地图集合视图上的迭代器联系起来(并明确这些集合视图是什么).这对我来说是缺失的一块. (2认同)

sbl*_*ndy 11

看看来源,看起来确实如此.keySet(),values()entrySet()所有在内部使用相同的条目迭代器.

  • 拥有存储库的链接会很酷,但我很懒:-),当然,它不能保证向前兼容性。 (2认同)

anz*_*aan 6

不要混淆LinkedHashMap.keySet()LinkedHashMap.entrySet()返回Set,因此它不应该保证订购!

Set是一个接口HashSet,TreeSet等众生它的实现.接口的HashSet实现Set不保证订购.但是TreeSet.也是LinkedHashSet.

因此,它取决于如何Set实现LinkedHashMap以了解返回的Set参考是否将保证订购.我浏览了源代码LinkedHashMap,看起来像这样:

private final class KeySet extends AbstractSet<K> {...}
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {...}
Run Code Online (Sandbox Code Playgroud)

因此LinkedHashMap/HashMap有自己的Setie 实现KeySet.因此,不要混淆这一点HashSet.

此外,订单由元素插入存储桶的方式维护.看看它的addEntry(..)方法,LinkedHashMap并与之相比较HashMap,突出了HashMap和之间的主要区别LinkedHashMap.

  • 虽然这个答案肯定会提供有用的信息,但它并没有真正回答这个问题.它基本上说它们可以有可预测的迭代顺序. (4认同)

use*_*421 5

你可以这么认为.Javadoc说'可预测的迭代顺序',Map 唯一可用的迭代器 keySet(),entrySet()和values().

因此,在没有任何进一步限定的情况下,它显然适用于所有这些迭代器.