1. 整体架构
Scala容器类是非常丰富的,整体架构也比较复杂,下面我们来根据图(10-2)来认识一下。Scala的容器类都是从Traversable和Iterable这两个trait开始的,然后分为三大类,分别是Seq,Set和Map,然后Seq又分为IndexedSeq和LinearSeq两种。其中IndexedSeq可以理解为数组形式,类似于Java中的ArrayList,而LinearSeq是以链表的形式存储的,类似于Java中的LinkedList。然后我们回来再看一下顶端的两个trait,其中Traversable允许你通过for each来重复遍历容器中的内容,而Iterable允许你使用Iterable遍历整个容器,区别是实用iterable遍历容器时,对于容器内的每个元素只能遍历到一次,这一点鹤Java的Iterable保持一致。
2. Seq
我们来看一下Seq的架构图,刚才已经提到Seq分类IndexedSeq和LinearSeq两大类。
其中IndexSeq允许你通过索引(下标)来随机访问,比如你想获取容器内下标为5000的值,你可以直接使用IndexedSeq(5000)来实现,IndexdSeq的默认实现为Vector。
scala> val x = IndexedSeq(1,2,3)
x: IndexedSeq[Int] = Vector(1, 2, 3)
scala> x(1)
res22: Int = 2
而LinearSeq被高效的划分为头和尾部,其中头是容器内的第一个元素,而尾部为除了头元素之外剩余的所有元素。我们可以方便的使用head和tail已经isEmpty方法来访问LinearSeq容器。LinearSeq的默认实现为List。
scala> val seq = collection.immutable.LinearSeq(1,2,3)
seq: scala.collection.immutable.LinearSeq[Int] = List(1, 2, 3)
scala> seq.head
res23: Int = 1
scala> seq.tail
res24: scala.collection.immutable.LinearSeq[Int] = List(2, 3)
scala> seq.isEmpty
res25: Boolean = false
3. Map
Map作为一个存储键值对的容器(key-value),其中key值必须是唯一的,结构见图(10-4)。
默认情况下,我们可以通过Map直接创建一个不可变的Map容器对象,这时候容器中的内容是不能改变的。如果你想获得一个内容可变的Map,那么必须使用scala.collection.mutable.Map来创建。
scala> val m = Map(1 -> "a", 2 -> "b")
m: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b)
scala> val m = scala.collection.mutable.Map(1 -> "a", 2 -> "b")
m: scala.collection.mutable.Map[Int,String] = Map(2 -> b, 1 -> a)
4. Sets
Scala中的Set和Java中的Set一样,存储的内容是不可重复的。
默认情况下,我们可以通过Set直接创建一个不可变的Set容器。和Map一样你可以使用mutable包中的Set来创建一个可变的Set容器。
scala> val set = Set(1,2,3)
set: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
scala> val set = collection.mutable.Set(1,2,3)
set: scala.collection.mutable.Set[Int] = Set(1, 2, 3)
来源:oschina
链接:https://my.oschina.net/u/2633112/blog/651537