我所知,Java Collections API 中唯一按插入顺序对其条目进行排序的 Map 实现是 LinkedHashMap
,它维护链表。
为什么没有像ArrayMap
这样在内部使用数组或ArrayList
的东西?将ArrayList
和LinkedList
分开的差异在地图中是否不再重要?还是我错过了一些使这种数据结构通常成为一个坏主意的东西?如果是这种情况,如果我想要插入顺序,LinkedHashMap
是我在 Java 标准库中实现 Map 的唯一选择吗?
HashMap 已经是一种基于数组的数据结构。插入条目时,将对键进行哈希处理,并通过压缩哈希来计算确切的索引。然后将条目放在该索引中。
从HashMap制作LinkedHashMap所需的额外部分是LinkedHashMap的条目也包含上一个和下一个指针。
制作一个基于数组的 LinkedHashMap 将需要将所有条目移回一个索引,以便为前面的新条目创建空间,有效地使其成为 O(n( 操作,这在当前实现的 O(1( 中发生。
Map
接口公开映射中每个条目的Map.Entry
对象。 这迫使Map
实现实际上具有这些对象,然后可以轻松地将它们链接在一起形成双向链表。
此外,当一个条目从映射中删除时,需要从插入顺序列表中的任何位置删除它,如果你以明显的方式这样做,这在链接结构中比在数组中更有效。
这两件事都是可以修复的,并且可以制作一个由数组支持的维护插入顺序的Map
,但它会稍微复杂一些,而且没有任何优势。