【发布时间】:2011-08-10 22:24:48
【问题描述】:
我对 Scala 的 HashSet 和 Set 类型感到非常困惑,因为它们似乎都在做同样的事情。
- 它们有什么区别?
- Java 中也一样吗?
- 在我的参考中它说
HashSet是一个“显式集合类”(与Set相比)。这是什么意思?
【问题讨论】:
我对 Scala 的 HashSet 和 Set 类型感到非常困惑,因为它们似乎都在做同样的事情。
HashSet 是一个“显式集合类”(与Set 相比)。这是什么意思?【问题讨论】:
Scala 的可变和不可变HashSet 实现是可以实例化的具体类。例如,如果您明确要求一个新的scala.collection.immutable.HashSet,您将始终得到一个由哈希树实现的集合。还有其他的集合实现,比如ListSet,它使用了一个列表。
Set 是一个 trait,所有 set 实现都对其进行了扩展(而在 Java 中,Set 是一个接口)。
Set 也是带有 apply** 方法的伴生对象*。当你调用Set(...) 时,你正在调用这个工厂方法并得到一个返回值,它是某种Set。它可能是HashSet,但也可能是其他一些实现。根据2 的说法,不可变集的默认实现对空集有特殊的表示,并将大小设置为最大为 4。不可变集的大小为 5 及以上,可变集都使用 hashSet。
*在 Scala 中,您可以创建一个与您的类或 trait 同名的单例 object,而不是静态类方法。这称为伴生对象,您在其上定义的方法可以称为ObjectName.method(),类似于您在 Java 中调用静态方法的方式。
**Set(x) 是Set.apply(x) 的语法糖。
【讨论】:
It might be a HashSet, but could be some other implementation. - 但哪些因素取决于返回的 Set 类型?在我认为Set 的默认实现是HashSet 之前,IndexedSeq - Vector 等等..