我知道LinkedHashMap
具有可预测的迭代顺序(插入顺序)。通过LinkedHashMap.keySet()
返回的Set
和LinkedHashMap.values()
返回的Collection
是否也保留此顺序?
我知道LinkedHashMap
具有可预测的迭代顺序(插入顺序)。通过LinkedHashMap.keySet()
返回的Set
和LinkedHashMap.values()
返回的Collection
是否也保留此顺序?
Collection
是values()
返回值的基类。它返回的Collection
的实现仍由LinkedHashMap
控制。在LinkedHashMap
的情况下,它返回一个LinkedValues
实例,这是LinkedHashMap.java
中的一个私有类。 - Powerlord从源代码来看,似乎是这样的。keySet()
,values()
和entrySet()
内部都使用相同的条目迭代器。
private final class KeySet extends AbstractSet<K> {...}
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {...}
Set
实现,即KeySet
。因此不要将其与HashSet
混淆。LinkedHashMap
的addEntry(..)
方法,并将其与HashMap
进行比较,这突显了HashMap
和LinkedHashMap
之间的主要区别。据我所知,这并没有被记录下来,因此您不能“正式”假设。然而,当前的实现不太可能改变。
如果您想确保顺序,可以遍历映射条目并将它们插入到一个排序集合中,该集合具有您选择的顺序函数,但自然会付出性能成本。
values()
和keySet()
的问题,我已经扩展了问题的范围。这意味着更多的问题可以被关闭为此类重复问题。 - Duncan Jones