在Scala中创建列表和集:我实际得到了什么?

时间:2010-06-30 13:09:54

标签: list scala set scala-collections

如果我使用Set在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:这实际上是什么类型的套装?它是一些散列集吗?例如,查找的复杂性是什么?

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


同样,如果我使用List创建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 - 包的一部分。为什么它存在于scala包中?

问题4:我可以在API中阅读有关此“创建列表”方法的内容吗?

3 个答案:

答案 0 :(得分:22)

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

Q2:你需要查看对象集的apply方法,而不是类。执行apply时,调用Set类的someSet(something)方法。

问题3:scala.::是一个非空的不可变单链表(如果你没有参数List(),你会得到Nil这是一个不可变的空列表)。它位于scala包中,因为它被认为是基本的,它属于基础包。

问题4:见Q2。

答案 1 :(得分: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

答案 2 :(得分: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。::表示任何非空列表。