12

如果我Set使用 Scala 在 Scala 中创建一个,Set(1, 2, 3)我会得到一个immutable.Set.

scala> val s = Set(1, 2, 3)
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

Q1:这到底是个什么样的Set?它是一些哈希集吗?例如,查找的复杂性是多少?

Q2:我在哪里可以了解这种“创建集合”的方法?我认为这是apply方法,但文档说“此方法允许将集合解释为谓词。它返回 true,如果此集合包含元素 elem。


同样,如果我创建一个Listusing List(1, 2, 3),我会得到

scala> val l = List(1, 2, 3)
l: List[Int] = List(1, 2, 3)

scala> l.getClass
res13: java.lang.Class[_] = class scala.$colon$colon

Q3:同样,我会得到什么?在这种情况下,我什至无法立即判断它是否可变,因为它甚至不是scala.collection-package 的一部分。为什么这个住在scala包里?

Q4:我可以在 API 中的什么地方了解这种“创建列表”的方法?

4

3 回答 3

22

Q1:在这种特定情况下,您会得到一个Set3由三个参数组成的不可变集合。大概它使用 if-else if-else 来检查包含。如果您创建一组超过 4 个元素,您将获得一个不可变的哈希集。

Q2:需要看apply对象Set的方法,而不是类。Set 类的apply方法就是你做的时候调用的方法someSet(something)

Q3:scala.::是一个非空的不可变单链表(如果你不List()带参数,你会得到Nil一个不可变的空表)。它存在于scala包中,因为它被认为是如此基本,以至于它属于基本包。

Q4:见 Q2。

于 2010-06-30T13:16:14.980 回答
12

只是为了增加 sepp2k 对 Q3 的出色回答,他说

它存在于scala包中,因为它被认为是如此基本,以至于它属于基本包。

这适用于 Scala 2.7

在 Scala 2.8 中,集合类已被重新组织,现在::该类存在于 中scala.collection.immutable,名称scala.::是 的类型别名scala.collection.immutable.::

Welcome to Scala version 2.8.0.RC5 (OpenJDK 64-Bit Server VM, Java 1.6.0_18).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val l = List(1, 2, 3)
l: List[Int] = List(1, 2, 3)

scala> l.getClass
res0: java.lang.Class[_] = class scala.collection.immutable.$colon$colon

scala> scala.::
res1: collection.immutable.::.type = scala.collection.immutable.$colon$colon$@6ce5d622
于 2010-06-30T13:29:36.303 回答
1

如果你调用 getClass 方法

scala> val list = List(1,2,3,45)
list: List[Int] = List(1, 2, 3, 45)

scala> val seq = Seq(1,2,3,4,5)
seq: Seq[Int] = List(1, 2, 3, 4, 5)

scala> list.getClass
res13: Class[_ <: List[Int]] = class scala.collection.immutable.$colon$colon

scala> seq.getClass
res14: Class[_ <: Seq[Int]] = class scala.collection.immutable.$colon$colon

那是因为 scala.collection.immutable.List 是一个抽象类,它有两个实现:scala.Nil 类和 scala.::。在 Scala 中,:: 是一个有效的标识符,你可以用它来命名一个类。Nil 表示一个空列表,而 scala.:: 表示任何非空列表。

于 2014-03-27T03:44:38.603 回答