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

时间:2019-04-10 11:57:38

标签: java dictionary collections linkedhashmap

我试图了解我是否可以从链接的哈希图中获取条目的链接列表。我可以得到entrySet(),然后使用迭代器遍历插入顺序中的每个条目。这会给我按插入顺序的条目的链接列表。

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

3 个答案:

答案 0 :(得分:4)

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

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

现在,让我们看一下在同一文件中从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()都将以相同的方式对待映射值的访问。

答案 1 :(得分:1)

  

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

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

  

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

但是突出显示的摘录让我这么想。

“相同的结果”不只是数据收集:它包括数据的迭代方式(迭代器)。 “对地图的更改反映在集合中” 对我而言,这意味着两个迭代器共享一种算法,该算法在相同的数据段上将产生相同的行为。

答案 2 :(得分:0)

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