risc-v中文社区

 找回密码
 立即注册
查看: 922|回复: 0

[原创] risc-v开发基础 Scala Map/Set ---(7)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-3 11:33:14 | 显示全部楼层 |阅读模式
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,然后再将值给它,最后再返回给用户。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-27 14:33 , Processed in 0.028310 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表