是否保证从LinkedHashMap对象返回键和值的顺序?
我知道LinkedHashMap
有一个可预测的迭代顺序(插入顺序)。 LinkedHashMap.keySet()
返回的Set
和LinkedHashMap.keySet()
返回的Collection
是否也维护这个顺序?
Map接口提供三个集合视图 ,这些视图允许将地图内容视为一组键,值集合或键值映射集。 地图的顺序被定义为地图集合视图上的迭代器返回其元素的顺序。 一些地图实现,比如
TreeMap
类,对它们的顺序做出了特定的保证; 其他人,如HashMap
类,不。
– 地图
这个链表定义了迭代sorting,通常是键被插入映射的顺序 ( 插入顺序 )。
– LinkedHashMap
所以,是的, keySet()
, values()
和entrySet()
(提到的三个集合视图)以内部链表使用的顺序返回值。 是的,JavaDoc for Map
和LinkedHashMap
保证了它。
毕竟,这是这个阶级的重点。
看看源代码,看起来像是这样。 keySet()
, values()
和entrySet()
在内部都使用相同的条目迭代器。
你可以这样认为。 Javadoc说'可预测的迭代顺序',Map 中唯一可用的迭代器是 keySet(),entrySet()和values()。
所以在没有进一步限定的情况下,显然是要适用于所有这些迭代器。
不要混淆LinkedHashMap.keySet()
和LinkedHashMap.entrySet()
返回Set,因此它不应该保证sorting!
Set
是一个与HashSet
, TreeSet
等接口的实现。 Set
接口的HashSet
实现不保证sorting。 但TreeSet
。 LinkedHashSet
也是。
因此它取决于如何在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
混淆。
此外,订单由元素如何插入存储桶来维护。 查看LinkedHashMap
的addEntry(..)
方法,并将其与HashMap
方法进行比较,突出了HashMap
和LinkedHashMap
的主要区别。
AFAIK它没有logging,所以你不能“正式”承担这一点。 然而,目前的实施情况不太可能会改变。
如果你想确保订单,你可能需要遍历地图实体,并将它们插入一个有你select的订单function的有序集合,尽pipe你自然会付出性能成本。
看看界面,它返回一个普通的Set
而不是一个SortedSet
。 所以没有保证。
在通过查看实现来假设隐式保证之前(总是一个坏主意),也请看所有其他Java实现中的实现:)
你可以更好地在构造函数中用keySet创build一个TreeSet实例。
我不认为你可以推定keySet()和values()的sorting。
只要我坚持在Map中定义的这两个方法的合约,并在HashMap中重写,我就可以轻松地编写一个LinkedHashMap的实现来返回无序的keySet()和values()。