在 Java 中,我LinkedHashMap
用于此目的。Java 的文档LinkedHashMap
非常清楚,它具有“可预测的迭代顺序”,而我在 Scala 中也需要它。
Scala 有ListMap
and LinkedHashMap
,但是关于他们所做的事情的文档很差。
问题:是 Scala 的LinkedHashMap
还是ListMap
用于此目的的实现?如果没有,除了直接使用 Java 之外,还有哪些可用的选项LinkedHashMap
?
在 Java 中,我LinkedHashMap
用于此目的。Java 的文档LinkedHashMap
非常清楚,它具有“可预测的迭代顺序”,而我在 Scala 中也需要它。
Scala 有ListMap
and LinkedHashMap
,但是关于他们所做的事情的文档很差。
问题:是 Scala 的LinkedHashMap
还是ListMap
用于此目的的实现?如果没有,除了直接使用 Java 之外,还有哪些可用的选项LinkedHashMap
?
从LinkedHashMap
Scaladoc 页面:
两者的区别在于LinkedHashMap
可变而不可变ListMap
。否则,它们既是MapLike
并且也保留插入顺序。
对于 LinkedHashMap,答案很清楚,它保留了插入的顺序。
但是对于ListMap,这里似乎有些混乱。
首先,有两个ListMap。
其次,据我尝试,ListMap 的文档有问题。
实际订单不是它所说的插入订单。
而且它也不是插入的相反顺序。我尝试的结果是[第四,第二,第一,第三]
一个由列表支持的简单可变映射,因此它保留了插入顺序。
正如文档所说,顺序是插入顺序。
需要注意的一件事是它以相反的插入顺序在内部存储。内部存储的顺序和可迭代/遍历的顺序是两件事。内部存储的顺序决定了head/last/tail/init/等查找方法的时间复杂度。
此类使用基于列表的数据结构实现不可变映射。列表映射迭代器和遍历方法按照第一次插入的顺序访问键值对。
条目以相反的插入顺序在内部存储,这意味着最新的键位于列表的头部。
LinkedHashmap 仅作为可变映射实现 ListMaps 在 mutable 和 immutable 包中都实现,但是只有不可变 ListMaps 保持向后排序。(可变列表图不保持顺序)
Scala 2.13 引入了两个新的不可变实现,Map
它们保持插入顺序:VectorMap
和SeqMap
. 看到这个公关:
目前没有任何已知的不可变映射也保持键插入顺序,同时有效地保持对键的恒定查找时间,因此唯一已知的实现是通过将 Vector 与 HasMap(或在 Scala 的情况下为 HashMap/ChampHashMap)组合来完成
在撰写本文时,Scala 2.13 仍计划于 2018 年发布。
更新 2021-04-14:Scala 3.13VectorMap
现在确实有。SeqMap
只是“有序不可变映射的通用特征”。除了新VectorMap
的和旧的ListMap
,还有一个新的TreeSeqMap
。
请注意,mutable.ListMap
2.13 已弃用,但immutable.ListMap
仍然是最新的。