微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

HashMap与LinkedHashMap在values迭代中的性能

如何解决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;
    }
}

但是LinkedHashMapjava.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在练习中检查这两个类中的方法

解决方法

HashMapLinkedHashMap遍历values()函数之间是否有性能差异?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。