HashSet
和Set
之间有什么区别?每个人应该在何时使用?这是Map
vs HashMap
:
val hashSet = HashSet("Tomatoes", "Chilies")
val set = Set("Tomatoes", "Chilies")
set == hashSet // res: Boolean = true
答案 0 :(得分:28)
Set
是一个特质。您可以通过调用其伴随对象的Set
方法来创建apply
的实例,该方法返回默认的不可变Set
的实例。例如:
val defaultSet = Set("A", "B")
HashSet
是Set
的具体实现,可以实例化如下:
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)
当您调用Set
或Map
函数时,实际上是在调用.apply
或Set
对象的Map
方法。这些是工厂方法,选择Rarry答案中记录的适当类型。相反,当您直接实例化HashSet时,您自己就做出了选择。