我试图了解我是否可以从链接的哈希图中获取条目的链接列表。我可以得到entrySet()
,然后使用迭代器遍历插入顺序中的每个条目。这会给我按插入顺序的条目的链接列表。
如果使用values()
方法,是否可以保证相同的结果?
答案 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.LinkedHashIterator
和entrySet()
都使用的values()
,因此,如果前者允许您按插入顺序进行迭代,则后者将执行相同的操作。