第十章 Scala 容器(一):总体介绍

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。spa

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

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)。
code

    默认状况下,咱们能够经过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容器。
it

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)
相关文章
相关标签/搜索