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

我知道LinkedHashMap有一个可预测的迭代顺序(插入顺序)。 LinkedHashMap.keySet()返回的SetLinkedHashMap.keySet()返回的Collection是否也维护这个顺序?

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

– 地图

这个链表定义了迭代sorting,通常是键被插入映射的顺序插入顺序 )。

– LinkedHashMap

所以,是的, keySet()values()entrySet() (提到的三个集合视图)以内部链表使用的顺序返回值。 是的,JavaDoc for MapLinkedHashMap保证了它。

毕竟,这是这个阶级的重点。

看看源代码,看起来像是这样。 keySet()values()entrySet()在内部都使用相同的条目迭代器。

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

所以在没有进一步限定的情况下,显然是要适用于所有这些迭代器。

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

Set是一个与HashSetTreeSet等接口的实现。 Set接口的HashSet实现不保证sorting。 但TreeSetLinkedHashSet也是。

因此它取决于如何在LinkedHashMap实现Set来知道返回的Set引用是否可以保证sorting。 我经历了LinkedHashMap的源代码,它看起来像这样:

 private final class KeySet extends AbstractSet<K> {...} public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {...} 

因此LinkedHashMap / HashMap有自己的Set KeySet 。 因此不要把这个与HashSet混淆。

此外,订单由元素如何插入存储桶来维护。 查看LinkedHashMapaddEntry(..)方法,并将其与HashMap方法进行比较,突出了HashMapLinkedHashMap的主要区别。

AFAIK它没有logging,所以你不能“正式”承担这一点。 然而,目前的实施情况不太可能会改变。

如果你想确保订单,你可能需要遍历地图实体,并将它们插入一个有你select的订单function的有序集合,尽pipe你自然会付出性能成本。

看看界面,它返回一个普通的Set而不是一个SortedSet 。 所以没有保证。

在通过查看实现来假设隐式保证之前(总是一个坏主意),也请看所有其他Java实现中的实现:)

你可以更好地在构造函数中用keySet创build一个TreeSet实例。

我不认为你可以推定keySet()和values()的sorting。

只要我坚持在Map中定义的这两个方法的合约,并在HashMap中重写,我就可以轻松地编写一个LinkedHashMap的实现来返回无序的keySet()和values()。