Scala Iterable';s";toMap“;方法返回?
A有一个Scala Iterable';s";toMap“;方法返回?,scala,Scala,A有一个toMap方法,该方法返回一个映射。这张地图的背景是什么?它的性能特点是什么 有没有办法指定toMap应该返回一个HashMap?它返回一个不可变的.HashMap,它实际上是一个。这种数据结构本质上是多级哈希表和trie的混合体。对于所有操作,哈希数组映射trie的最坏情况复杂度都是O(logn),尽管常数因子非常低,但哈希数组映射的尝试非常浅,通常只有几个间接。您可以阅读更多关于性能特征的信息,也可以运行一些微博客。在大多数情况下,性能是可以接受的 toMap总是返回一个散列trie
toMap
方法,该方法返回一个映射。这张地图的背景是什么?它的性能特点是什么
有没有办法指定
toMap
应该返回一个HashMap
?它返回一个不可变的.HashMap
,它实际上是一个。这种数据结构本质上是多级哈希表和trie的混合体。对于所有操作,哈希数组映射trie的最坏情况复杂度都是O(logn)
,尽管常数因子非常低,但哈希数组映射的尝试非常浅,通常只有几个间接。您可以阅读更多关于性能特征的信息,也可以运行一些微博客。在大多数情况下,性能是可以接受的
toMap
总是返回一个散列trie。如果需要可变哈希表,请执行以下操作:
import collection._
mutable.HashMap() ++= xs
而不是:
xs.toMap
了解Scala它使用的是
CanBuildFrom
隐式映射,得到的映射类型取决于范围内的映射生成器类型,这取决于您导入的内容。请参阅Scala集合。这是该语言的保证还是它现在的实现方式?如果它是该语言的保证,那么它将成为合同的一部分toMap
将被声明为返回immutable.HashMap
。由于它不是合同的一部分,我们可以假设Scala语言的创建者将确保返回标准库中可用的最佳通用映射实现。如果出现比immutable.HashMap
更好的方法,他们可能会更改toMap
@Malvolio返回的内容-这就是现在实现的方式。例如,并行集合将返回Parallel.immutable.HashMap。我查看了scala.collection.*中的代码,并认为toMap
是O(n^2)
——从列表中构建的映射是不可变的,每次添加元素时都必须从上一个映射对象克隆新的映射对象。一些微基准点支持这一点:对于包含5000个元素的映射,Scala比快速Java实现慢8倍,对于500000个元素,Scala慢20倍。向不可变映射添加元素不是O(n)
,因此toMap
不是二次的。如果是这样的话,50万个元素的微基准点速度会慢得多。