我认为,
linkedHashMap由于其高级
nextEntry实现,遍历必须更快
Iterator
这就是为什么:
让我们逐步
values执行。
该
HashMap实施
values是这样的:
public Collection<V> values() { Collection<V> vs = values; return (vs != null ? vs : (values = new Values()));}在
linkedHashMap从扩展
HashMap和继承相同的实现。
两者的
Iterator实现方式不同
Values。
因为
HashMap它从
java.util.HashMap.HashIterator
private final class ValueIterator extends HashIterator<V> { public V next() { return nextEntry().value; }}但是
linkedHashMap从
java.util.linkedHashMap.linkedHashIterator
private class ValueIterator extends linkedHashIterator<V> { public V next() { return nextEntry().value; }}因此, 差异 本质上可以归结为
nextEntry实施。
因为
linkedHashMap它只是调用e.after,其中e是
Entry,但是对于
HashMap遍历
Entry[]数组以查找下一个下一个要涉及一些工作。
UPDATE :用于
nextEntry()在
HashMap
final Entry<K,V> nextEntry() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); Entry<K,V> e = next; if (e == null) throw new NoSuchElementException(); if ((next = e.next) == null) { Entry[] t = table; while (index < t.length && (next = t[index++]) == null) ; } current = e; return e;}Entry []不是连续的存储。(之间可能有空值)。如果您看一下上面的代码,它的作用是指向current旁边,并通过迭代Entry []找到下一个next。
但是 我认为这种性能提升将以插入为代价。
addEntry在练习中检查这两个类中的方法。



