在 Java 中,我LinkedHashMap用于此目的。Java 的文档LinkedHashMap非常清楚,它具有“可预测的迭代顺序”,而我在 Scala 中也需要它。
Scala 有ListMapand LinkedHashMap,但是关于他们所做的事情的文档很差。
问题:是 Scala 的LinkedHashMap还是ListMap用于此目的的实现?如果没有,除了直接使用 Java 之外,还有哪些可用的选项LinkedHashMap?
在 Java 中,我LinkedHashMap用于此目的。Java 的文档LinkedHashMap非常清楚,它具有“可预测的迭代顺序”,而我在 Scala 中也需要它。
Scala 有ListMapand LinkedHashMap,但是关于他们所做的事情的文档很差。
问题:是 Scala 的LinkedHashMap还是ListMap用于此目的的实现?如果没有,除了直接使用 Java 之外,还有哪些可用的选项LinkedHashMap?
从LinkedHashMapScaladoc 页面:
两者的区别在于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.ListMap2.13 已弃用,但immutable.ListMap仍然是最新的。