Scala Iterable';s";toMap“;方法返回?

Scala Iterable';s";toMap“;方法返回?,scala,Scala,A有一个toMap方法,该方法返回一个映射。这张地图的背景是什么?它的性能特点是什么 有没有办法指定toMap应该返回一个HashMap?它返回一个不可变的.HashMap,它实际上是一个。这种数据结构本质上是多级哈希表和trie的混合体。对于所有操作,哈希数组映射trie的最坏情况复杂度都是O(logn),尽管常数因子非常低,但哈希数组映射的尝试非常浅,通常只有几个间接。您可以阅读更多关于性能特征的信息,也可以运行一些微博客。在大多数情况下,性能是可以接受的 toMap总是返回一个散列trie

A有一个
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万个元素的微基准点速度会慢得多。