HashSet和Set有什么区别,什么时候应该使用它们?

时间:2013-09-12 09:02:26

标签: scala

HashSetSet之间有什么区别?每个人应该在何时使用?这是Map vs HashMap

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

2 个答案:

答案 0 :(得分:28)

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

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

HashSetSet的具体实现,可以实例化如下:

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

查看“Scala编程”中的引用,解释了各种实现之间的差异:

  

scala.collection.mutable.Set()工厂方法,例如,   返回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

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

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

答案 1 :(得分:5)

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