Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么LinkedHashMap中通过bucket的迭代比HashMap快?_Java_Collections_Hashmap_Linkedhashmap - Fatal编程技术网

Java 为什么LinkedHashMap中通过bucket的迭代比HashMap快?

Java 为什么LinkedHashMap中通过bucket的迭代比HashMap快?,java,collections,hashmap,linkedhashmap,Java,Collections,Hashmap,Linkedhashmap,我很难理解这一点 谷歌搜索,我发现 “HashMap迭代器必须遍历所有存储桶,包括 “空桶” 及 “在LinkedHashMap中,所有条目都是双重链接的” 如果这就是为什么唯一的HashMap必须遍历空bucket,而不是LinkedHashMap,尽管两者都是使用相同的bucket概念实现的?所有条目都是双重链接的,即“所有存储桶和元素都是双重链接的”或仅“元素是双重链接的” 请为我提供一个图表,解释LinkedHashMap中的双链接Bucket实现 非常感谢。LinkedHashMap的

我很难理解这一点

谷歌搜索,我发现

“HashMap迭代器必须遍历所有存储桶,包括 “空桶”

“在LinkedHashMap中,所有条目都是双重链接的”

如果这就是为什么唯一的HashMap必须遍历空bucket,而不是LinkedHashMap,尽管两者都是使用相同的bucket概念实现的?所有条目都是双重链接的,即“所有存储桶和元素都是双重链接的”或仅“元素是双重链接的”

请为我提供一个图表,解释LinkedHashMap中的双链接Bucket实现

非常感谢。

LinkedHashMap的全部要点是要有一个单独的节点链接列表(仅限于;存储桶本身没有链接)进行迭代,这样您就可以有一个可预测的迭代顺序。因此,
LinkedHashMap
可以更快地迭代

要回答您关于“虽然两者都是使用相同的bucket概念实现的”的问题:
HashMap
只有一个哈希表,而
LinkedHashMap
既有一个哈希表又有一个链表;按键查找使用哈希表,迭代使用链表


LinkedHashMap
的折衷是,您必须保留一个额外的链表(除了哈希表之外,
HashMap
LinkedHashMap
都有哈希表),这是额外的空间使用。

LinkedHashMap
存储桶节点(条目)保留额外的两个指针(
)为了维持秩序

这是创建时的结构。

Map<Integer, String> linkedHashMap = new LinkedHashMap<Integer, String>();
这里的
linkedHashMap
头before,after指向条目对象

让我们再添加一个元素。

检查指针与红色先前状态的变化

让我们再添加一个元素。

next
指针插入每个
条目
以形成
SingleLikedList
,当插入另一个具有相同哈希的条目时

linkedHashMap.put(1, "obj1");
linkedHashMap.put(15, "obj15");
linkedHashMap.put(4, "obj4");