当前位置: 首页 > 面试题库 >

HashMap与LinkedHashMap在values()迭代中的性能

邵刚洁
2023-03-14
问题内容

HashMapLinkedHashMap遍历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[]数组以查找下一个下一个要涉及一些工作。

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



 类似资料:
  • 问题内容: 我有两个哈希图 每个哈希图都有不同的键和值。我试图同时遍历两个哈希图,并乘以每个值 最简单快捷的方法是什么?我在两个哈希图中都有数千个值。 谢谢 问题答案: 您可能做错了… 首先,HashMap无法存储整数,它需要适当的对象-如整数-数组是一个对象,尽管它隐藏在某些语法糖的后面。 如果它们恰好具有相同的大小,这是循环遍历这两个地图的方法,我想这就是您的意思。 但是您可能应该回过头来重新

  • 这是hashmap,当我尝试迭代它并打印值时,例如,我从随机位置获得值。为什么不显示0.92,0.91,0.90。。。 迭代后的结果: 0.5 0.32 0.68 0.18 0.82 0.49 0.51 0.31 0.69 0.48 0.52 0.08 0.92 0.17 0.83 0.47 0.3 0.7 0.53 0.16 0.84 0.46 0.54 0.29 0.71 0.45 0.55

  • 我正在尝试迭代作为参数传递给jrxml的<code>HashMap</code>的值,在<code>HashMap</code>中,这些值作为<code>List</code>传递。 例 我如何在jasper report Jr XML中迭代这些< code>List?

  • 有点初学者的问题但是... 我有一个从数据库返回的ResultSet对象-3列30行。 我检索以下数据集: null 我知道这应该不难,我只是在努力寻找迭代HashMaps的ArrayList的最佳方法

  • 在javascript函数中尝试通过传递键迭代映射时,如下所示: 我得到的是空白值。但是当我硬编码key***user1***的值时,它就起作用了。 有人能帮我一下吗?

  • 我想在HashMap中搜索重复项。目前这是我的HashMap: