|
scala的集合collection区分为可变类型和不可变类型,比如Array是可变类型,而List保持不变(scala.collection.immutable.List)。
对于set和map来说,同样有可变和不可变,scala通过继承的差别将可变隐含其中。
在Predef.scala中:
type Map[A,+B] = immutable.Map[A,B]
type Set[A] = immutable.Set[A]
val Map = immutable.Map
val Set = immutable.Set
在Set.scala中:
trait Set[A] extends Iterable[A] with scala.collection.Set[A]....... //trait相当于java中的接口(interface)
object Set extends ImmutableSetFactory[set] .....
在scala.collection.Set.scala中:
trait Set[A] extends(A => Boolean) with Iterable[A] with GenSet[A].....
在Map.scala中:
trait Map[K,+V] extends Iterable[(K,V)] with scala.collection.Map[K,V] ....
object Map extends ImmutableMapFactory[Map]...
在scala.collection.Map.scala中:
trait Map[K,+V] extends Iterable[(K,V)] .....
object Map extends MapFactory[Map]....
以上的这些节选自scala源代码中的片段说明默认情况下scala都用的是immutable类型的Map或Set;
但我们再看scala-sdk源码中的包scala.collection.mutable,其中的Map和Set,可以看到如下代码:
在mutable\Map.scala中:
trait Map[K,V] extends Iterable[(K,V)] with scala.collection.Map[(K,V)]...
object Map extends MutableMapFactory[Map]....
在scala.collection.Map.scala中:
trait Map[K,+V] extends Iterable[(K,V)].....
在mutable\Set.scala中:
trait Set[A] extends Iterable[A] with scala.collection.Set[A]...
object Set extends MutableSetFactory[Set]....
在scala.collection.Set.scala中:
trait Set[A] extends (A => Boolean) with Iterable[A] whith GenSet[A]....
说了这么多,核心意思就是Set和Map是有区分mutable和immutable的,那么各自的实现类当然也有mutable和immutable之别了。
scala语言中,一个类可以with mutable类型的也可以with immutable类型的Set/Map,根据需要,这称之为“混入特质“:
比如混入mutable类型:
import scala.collection.mutable.HashSet
val hashSet = HashSet("zhansan","lisi","wangwu")
hashSet += "zhaoliu"
println(hashSet)
此时的hashSet添加了新元素之后还是原来的“实例”,但如果用immutable类型:
import scala.collection.immutable.HashSet //其实默认用的是immutable,所以这句其实没必要import,除非你做实验时先import了mutable类型的Map/Set
val hashSet = HashSet("zhansan","lisi","wangwu")
hashSet += "zhaoliu"
println(hashSet)
其实此时的hashSet已经不是最初的hashSet了,是新创建的一个HashSet,然后再将值给它,最后再返回给用户。
|
|