use*_*239 154 java iteration linkedhashmap
我知道LinkedHashMap有一个可预测的迭代顺序(插入顺序).是否Set通过返回LinkedHashMap.keySet()和Collection返回的LinkedHashMap.values()也维持这种秩序?
Pow*_*ord 218
Map接口提供了三个 集合视图,允许将映射的内容视为一组键,值集合或键值映射集.该订单的地图被定义为其中在地图上的集合视图迭代返回元素的顺序.一些地图实现,比如
TreeMap类,对它们的顺序做出了特定的保证; 其他人,比如HashMap班级,不这样做.
- 地图
此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序).
所以,是的,keySet(),values(),和entrySet()顺序(三个集提到的观点)的返回值的内部链接列表使用.是的,JavaDoc for Map并LinkedHashMap保证它.
毕竟,这就是本课程的重点.
sbl*_*ndy 11
看看来源,看起来确实如此.keySet(),values()和entrySet()所有在内部使用相同的条目迭代器.
不要混淆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.
你可以这么认为.Javadoc说'可预测的迭代顺序',Map 中唯一可用的迭代器是 keySet(),entrySet()和values().
因此,在没有任何进一步限定的情况下,它显然适用于所有这些迭代器.