为什么在LinkedHashMap中迭代桶的速度比HashMap快?

时间:2014-10-11 06:22:49

标签: java collections hashmap linkedhashmap

我很难理解这一点。

谷歌搜索,我找到了

  

" HashMap迭代器必须遍历所有桶,包括   空桶"

  

"在LinkedHashMap中,所有条目都是双重链接的"。

如果是这种情况,为什么唯一的HashMap必须迭代空桶,而不是LinkedHashMap,尽管两者都使用相同的桶概念实现?所有条目在意义上都是双重链接的; 所有桶和元素都是双重链接的"或者只有" 元素是双重链接的"。

请向我提供一个解释LinkedHashMap中双向链接桶实现的图表。

非常感谢提前。

2 个答案:

答案 0 :(得分:13)

LinkedHashMap个桶节点(条目)保留额外的两个指针(beforeafter)以维持订单。

这是创建时的结构。

Map<Integer, String> linkedHashMap = new LinkedHashMap<Integer, String>();

LinkedHashMap with no data

现在让我们添加一个元素。

linkedHashMap.put(1, "obj1");

linkedHashMap.put(1, "obj1"); 此处linkedHashMap标题之前,之后指向条目对象。

让我们添加另一个元素。

linkedHashMap.put(15, "obj15");

linkedHashMap.put(15, "obj15");

检查指针随红色前一状态的变化

让我们再添加一个元素。

linkedHashMap.put(4, "obj4");

linkedHashMap.put(4, "obj4");

当另一个条目插入相同的哈希值时,每个next中的

entry指针形成SingleLikedList

答案 1 :(得分:4)

LinkedHashMap整个点是要有一个单独的节点链接列表(只有;桶本身没有链接)来迭代,这样你就可以有一个可预测的迭代订购。所以是的,LinkedHashMap可以更快地迭代。

要回答您的问题“虽然两者都是使用相同的存储桶概念实现的”:HashMap只有 哈希表,而LinkedHashMap只有 哈希表链表;按键查找使用哈希表,迭代使用链表。

LinkedHashMap的权衡是你必须保留一个额外的链表(除了HashMapLinkedHashMap都有的哈希表),这是额外的空间使用