【scala初学】可变集合和不可变集合

scala的集合系统的区分了可变( mutable  )和不可变(immutable )集合。一个mutable  集合可以更新甚至扩展空间,这意味着你能改变,增长,或者删除一个集合的元素。 一个immutable集合,恰好相反,不能改变。你仍然能够作一些相似的增长,删除,或者更新,可是实际上(书生:跟java的string同样)他返回了一个新的对象,这里面就是指返回了一个新的集合,而老的集合没有改变。
html


全部的集合类在scala.collection 包中,或者他的子包中,分为mutable,immutable以及generic 。 大部分集合都有三个同名的类(经验翻译,不一样看法能够指正),每一个同名类有不一样的特征.java


scala.collection.immutable包中元素不可变,能够保证你在任什么时候间访问他时元素值都是相同的api

scala.collection.mutabl 包中的元素可变,因此你要知道他在什么时候何地变化了ide

有一些集合类不在上述两个包下,如collection.IndexedSeq[T]collection.immutable.IndexedSeq[T] 和collection.mutable.IndexedSeq[T] 的父类。通常状况下会在collection包下定义接口,由mutable和immutable两个包实现。函数


跳过一段废话。
ui


(书生:重点)spa

scala默认的集合包是不可变的 ,即cala.collection.immutable。 举例:scala

Set 若是没有导入,默认collection.immutable.Set翻译

若是你想用一个可变的Set,你须要导入collection.mutable.Set,即:code

import collection.mutable.Set

若是想两个都引用,又想简单写,有个办法:

import scala.collection.mutable

直接用Set则还是默认不可变的,若是想Set是mutable的,写成mutable.Set


还有一个包  collection.generic。 该package包含了实现集合的构建块。典型的, generic里classes推迟实现一些函数。另外一方面,集合framework的用户须要在一些特殊环境中用到generic中的类。


为了便利,以及向后兼容,一些重要的类型有别名,所以你能用它们的简称,而不须要import.如List

scala.collection.immutable.List   // that's where it is defined
scala.List                        // via the alias in the  scala package
List                              // because  scala._ 
                                  // is always automatically imported

其余的类型别名有TraversableIterableSeqIndexedSeqIteratorStreamVector,StringBuilder, and Range.


下图展现了最高等级的抽象类 abstract classes 或者接口 traits


collections.png

下图展现 scala.collection.immutable.

collections.immutable.png 

下图展现 scala.collection.mutable.

collections.mutable.png

一些例子,父类和实现类,参考上图:

Traversable(1, 2, 3)
Iterable("x", "y", "z")
Map("x" -> 24, "y" -> 25, "z" -> 26)
Set(Color.red, Color.green, Color.blue)
SortedSet("hello", "world")
Buffer(x, y, z)
IndexedSeq(1.0, 2.0)
LinearSeq(a, b, c)
List(1, 2, 3)
HashMap("x" -> 24, "y" -> 25, "z" -> 26)

以上toString方法实现相同,而且写法与如上相同。


 全部集合类都支持Traversable提供的API,但只有一些特殊类有意义。如Traversable 类中的 map 方法返回另外一个Traversable ,但结果类型会在子类中被重写。例如,在List中调用map,会返回一个List结果,在Set中调用返回Set.

scala> List(1, 2, 3) map (_ + 1) 
res0: List[Int] = List(2, 3, 4)
scala> Set(1, 2, 3) map (_ * 2)
res0: Set[Int] = Set(2, 4, 6)

上述集合函数库中的实现方式被成为 uniform return type principle. -- 一致返回类型原则


集合的大部分存在(指名字相同的类分别存在)三个包中:root,mutable,immutable.只有Buffer trait,只存在mutable集合中