![](/img/trans.png)
[英]Java Map realizations asymptotic complexity (HashMap, LinkedHashMap, TreeMap)
[英]Visualization of TreeMap and LinkedHashMap in Java
我试图了解这些数据结构实际上是如何可视化的。 据说TreeMap
将条目按[keys] 的自然顺序放置,而LinkedHashMap
则按照它们插入的顺序放置条目。
我的问题是,对这些数据结构中的每一个进行迭代是否意味着遍历分布在所有桶(或内部数组)上的所有元素?
我的理解是,例如,在TreeMap
情况下,具有相同哈希码的元素被放置在 [某种]树结构中。 因此,如果TreeMap
在 16 个索引 [在其存储桶数组中] 中的6个中具有元素,则它将包含6 个Tree
- 每个一个。
类似地,对于LinkedHashMap
(在现实中应该被称为DoublyLinkedHashMap ),每个桶都有一个自己的双向链表。
那么,迭代实际上是如何发生的呢? 是否发生过在所有的桶或仅在单个桶的元素的所有元素? 我的假设错了吗?
PS 似乎在Java 8 中, HashMap
实现使用Tree
或LinkedList
取决于每个包含超过 8 个或少于 6 个元素的桶的元素数量,分别!
正常实现的源代码位于 Oracle JDK 安装附带的 src.zip 文件中。
TreeMap
:如其文档所示,它是一棵红黑树。 键上简单前向迭代的关键代码是方法static <K,V> TreeMap.Entry<K,V> successor(Entry<K,V> t)
。 它以左-父-右的顺序递归扫描树。 它取决于根据节点的键顺序对插入树中的节点进行排序。
LinkedHashMap
:它有一个双向链表,按到达顺序强加在带有桶的散列结构之上。 嵌套类Entry
扩展HashMap.Node
添加before
和after
的引用。 正常前向迭代遵循after
链。
补充@patricia-shanahan的回答:
向LinkedHashMap
添加可视化(这适用于Java 7及更早版本,因为Java 8不同),假设元素按A
、 B
、 ...、 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 个引用: next
、 after
和before
。 因此,只有一个元素,即A
(类型LinkedHashMap.Entry<K, V>
),具有三个引用。 TreeMap
也有三个引用,但它们引用其他TreeMap.Entry<K, V>
的目的不同: parent
、 left
和right
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.