10

每种应该使用和何时使用有HashSet什么区别?Set这是Mapvs HashMap

val hashSet = HashSet("Tomatoes", "Chilies")
val set = Set("Tomatoes", "Chilies")
set == hashSet // res: Boolean = true
4

2 回答 2

29

Set是一种特质。Set您可以通过调用其伴随对象的方法来创建 a 的实例,该apply方法返回默认的 immutable 实例Set。例如:

val defaultSet = Set("A", "B")

HashSet是 a 的具体实现Set,可以如下实例化:

val hashSet = HashSet("A", "B")

看看“Programming in Scala”中的引用,它解释了各种实现之间的差异:

scala.collection.mutable.Set()例如,工厂方法返回 a ,scala.collection.mutable.HashSet它在内部使用哈希表。同样,scala.collection.mutable.Map()工厂返回一个scala.collection.mutable.HashMap.

不可变集合和地图的故事更复杂一些。例如,工厂方法返回的类scala.collection.immutable.Set()取决于您传递给它的元素数量,如下表所示。对于少于五个元素的集合,使用专门用于每个特定大小的集合的特殊类,以最大限度地提高性能。但是,一旦您请求一个包含五个或更多元素的集合,工厂方法将返回一个使用哈希尝试的实现。

Number of elements  Implementation
0                   scala.collection.immutable.EmptySet
1                   scala.collection.immutable.Set1
2                   scala.collection.immutable.Set2
3                   scala.collection.immutable.Set3
4                   scala.collection.immutable.Set4
5 or more           scala.collection.immutable.HashSet

这意味着对于Set具有 5 个或更多元素的不可变对象,您的两个调用都应返回同一Set子类的实例。

s也是如此Map。请参阅链接。

于 2013-09-12T09:11:22.560 回答
5

当您调用SetorMap函数时,您实际上是在调用or对象的.apply方法。这些是工厂方法,它们选择 Rarry 的答案中记录的适当类型。相反,当您直接实例化 HashSet 时,您是在自己做出选择。SetMap

于 2013-09-12T09:54:08.363 回答