繁体   English   中英

使用values()方法获取LinkedHashMap中条目的LinkedList

[英]Get LinkedList of entries from LinkedHashMap with values() method

我试图了解我是否可以从链接的哈希映射中获取条目的链接列表。 我可以获取entrySet()然后使用迭代器我通过插入顺序中的每个条目。 这将为我提供插入顺序中的条目链接列表。

如果我使用values()方法,可以保证相同的结果吗?

从Java 8开始,我们来看看LinkedHashMap的来源。 我们可以从entrySet()values()方法定义中扣除内部行为:

  • 方法entrySet()在第627行返回new LinkedEntrySet() ,它使用new LinkedEntryIterator()作为第634行的迭代器。
  • 方法values()在第581行返回new LinkedValues() ,它使用new LinkedValueIterator()作为第588行的迭代器。

现在,让我们看一下从第737行开始在同一个文件中定义的内部类的来源:

final class LinkedValueIterator extends LinkedHashIterator
    implements Iterator<V> {
    public final V next() { return nextNode().value; }
}

final class LinkedEntryIterator extends LinkedHashIterator
    implements Iterator<Map.Entry<K,V>> {
    public final Map.Entry<K,V> next() { return nextNode(); }
}

它们都扩展了LinkedHashIterator ,这意味着使用entrySet()values()将以相同的方式处理对map的值的访问。

如果我使用values()方法,可以保证相同的结果吗?

基本上, LinkedHashMap#values返回内部结构的受限视图。 我敢说它必须给出相同的结果。 它没有在文档中明确说明

返回此映射中包含的映射的Set视图。 该集由地图支持,因此对地图的更改将反映在集中,反之亦然

但突出显示的摘录让我这么认为。

“相同的结果”不仅仅是数据集合:它包括数据应该迭代的方式(迭代器)。 “对映射的更改反映在集合中”对我来说意味着两个迭代器共享一个算法,这个算法在同一条数据上会产生相同的行为。

我认同。 在内部,类使用java.util.LinkedHashMap.LinkedHashIterator ,它由entrySet()values() ,因此如果前者允许您按插入顺序进行迭代,则后者将执行相同的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM