繁体   English   中英

Java中TreeMap和LinkedHashMap的可视化

[英]Visualization of TreeMap and LinkedHashMap in Java

我试图了解这些数据结构实际上是如何可视化的。 据说TreeMap将条目[keys] 的自然顺序放置,而LinkedHashMap按照它们插入的顺序放置条目。

我的问题是,对这些数据结构中的每一个进行迭代是否意味着遍历分布在所有桶(或内部数组)上的所有元素?

我的理解是,例如,在TreeMap情况下,具有相同哈希码的元素被放置在 [某种]结构中。 因此,如果TreeMap在 16 个索引 [在其存储桶数组中] 中的6个中具有元素,则它将包含6 个Tree - 每个一个。

类似地,对于LinkedHashMap (在现实中应该被称为DoublyLinkedHashMap ),每个桶都有一个自己的双向链表。

那么,迭代实际上是如何发生的呢? 是否发生过在所有的桶或仅在单个桶的元素的所有元素? 我的假设错了吗?

PS 似乎在Java 8 中HashMap实现使用TreeLinkedList取决于每个包含超过 8 个或少于 6 个元素的桶的元素数量,分别!

正常实现的源代码位于 Oracle JDK 安装附带的 src.zip 文件中。

TreeMap :如其文档所示,它是一棵红黑树。 键上简单前向迭代的关键代码是方法static <K,V> TreeMap.Entry<K,V> successor(Entry<K,V> t) 它以左-父-右的顺序递归扫描树。 它取决于根据节点的键顺序对插入树中的节点进行排序。

LinkedHashMap :它有一个双向链表,按到达顺序强加在带有桶的散列结构之上。 嵌套类Entry扩展HashMap.Node添加beforeafter的引用。 正常前向迭代遵循after链。

补充@patricia-shanahan的回答:

LinkedHashMap添加可视化(这适用于Java 7及更早版本,因为Java 8不同),假设元素按AB 、 ...、 E顺序添加(并假设A有一个哈希码,使其落入如果存储桶 0 或D具有放置在存储桶 3 中的HashMap具有 4 个 bin 的HashMap将具有以下布局(“ | ”表示存储桶链表中HashMap.Entry<K, V>中的下一个属性变量):

║ 0 ║ 1 ║ 2 ║ 3 ║ 
╠═══╬═══╬═══╬═══╬
║ A ║   ║ B ║ D ║
╠═|═╬═══╬═|═╬═|═╬
║ E ║   ║ C ║nul║
╠═|═╬═══╬═|═╬═══╬
║nul║   ║nul║   ║    
╠═══╬═══╬═══╬═══╬

此外,每个元素A ... E将有两个额外的引用( LinkedHashMap.Entry<K, V>之后和之前):

A---->B---->C---->D---->E      
^____|^____|^____|^____|

所以LinkedHashMap.Entry<K, V> ,每个LinkedHashMap.Entry<K, V>将有 3 个引用: nextafterbefore 因此,只有一个元素,即A (类型LinkedHashMap.Entry<K, V> ),具有三个引用。 TreeMap也有三个引用,但它们引用其他TreeMap.Entry<K, V>的目的不同: parentleftright

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM