如何解决HashMap与LinkedHashMap在values迭代中的性能
我认为,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[]
数组以查找下一个下一个要涉及一些工作。
:用于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
在练习中检查这两个类中的方法。
解决方法
HashMap
和LinkedHashMap
遍历values()
函数之间是否有性能差异?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。