开发者学堂课程【Scala核心编程 - 进阶:可变集合和不可变集合体系】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9023
可变集合和不可变集合体系
内容介绍:
一、Scala 不可变集合继承关系一览图
二、不可变集合数据结构的应用
三、小结
四、Scala 可变集合一览图
一、Scala 不可变集合继承关系一览图
上一节课提到,scala 分为可变和不可变集合。
首先我们来看以下这张图,非常重要。
上面这个 transferable 是最顶级的,先不去讨论。Iterable 是最上面的一条,下边都继承了它,Iterable 分为 Set、Map 和 Seq 三个系列。
Seq 是 Iterable 所特有的。Set 和 Map 里面分别有 sortedset 和 Sortedmap,因此它们都具有排序的功能。
Indexedseq 是索引功能,有 range、array、string、NumberRange、Vector,它访问的方式可以通过下标来整合,因此,索引的速度较快。
LinearSeq 叫线性序列,其最大的特点是有头有尾,并且要通过链表来实现。
因此,这些序列一般都要慢一点。但是它的应用性比较强,在我们实际的应用场合中非常多。
比如队列、站,如果遇到有头有尾的,就可以去 LinearSeq 里面去找。
二、不可变集合数据结构的应用
递推中有一个很厉害的项目,叫做汉诺塔。
将它运行起来。
汉诺塔中可以将 A 塔的东西移动到 C 塔和 B 塔,大概需要二十几步,有一个来回递推的过程,最后 A 塔全部移动到 C 塔中。我们需要注意到代码是怎样编写的。
来看一个很有趣的队列,我们来写一下这个程序。
这是四个柜台,要求是有一堆排队的人,按照顺序从排队的人中找出一个人为他服务,服务的时间是随机数,服务完之后就离开大厅,这其实就是一个队列。叫号就可以通过这个来实现。
以下是它的运行过程。
三、小结
1.Set、Map 是 Java 中也有的集合。
2.Seq 是 Java 没有的,我们发现 List 归属到 Seq 了,因此,这里的List和Java不是同一个概念了。
3.我们前面的for循环有一个1to3,就是 IndexedSeq 下的 Vector。
4.String 也是属于 IndexedSeq。
为什么说 string 也是一个集合?
首先,它可以被遍历,每遍历一个东西,item 就会自动变成 char,String 都是按照这个顺序来的。
比如:val str=”hello”//字符串在Scala就是char的集合 IndexedSeq
For(item<-str){
Println(item)
也可以这样理解,当String变成二的时候,结果就会变成这样。
5.我们发现经典的数据结构,比如 Queue 和 stack 被归属到 LinerSeq。
6.注意,Scala 中的 Map 体系有一个 sortedmap,说明 Scala 的 Map 可以支持排序。
7.IndexedSeq 和 LinearSeq 的区别
IndexedSeq是通过索引来查找和定位,因此速度很快。比如string就是一个索引集合,通过索引即可定位。
LinearSeq是线型的,即有头尾的概念,这种数据结构一般是通过遍历来寻找,它的价值在于应用到一些具体的应用场景中。
遍历是数组加链表的形式。如果同学们对链表熟悉的话是无法深入理解的。
如果想做一个简单的内存哈希结构,一般都用现有的结构。哈希map的结构也是数组加链表的结构,所以推荐大家去看一下链表。
那么链表有什么作用呢?
比如一个即时的通讯软件客户端会发送多个ID,分别编有各自的编号,但是并没有顺序。
要求要把对应ID的状态和对应的好友发给上级,前提是返回的用户的ID是顺序排列的。
数据在网络上传输就会变成字符串,我们要将它有序地拿出来并且不能走数据库应该怎么办呢?
将这些数组组成一个链表,这个问题就可以化解。
具体的应用场景在哪里呢?假设有一个电商网站是做大数据的,做一个推荐系统。要求给用户推荐的商品是最近用户浏览的前十个商品。这时候就可以用队列,从中挑出十个即可。
一般不需要走数据库,因为用数据库速度慢,一般比较脆弱。数据库的优化一般都用缓存。
四、Scala 可变集合一览图
对上图的说明:
(1)在可变集合中比不可变集合更加丰富。
(2)在 Seq 集合中,增加了 Buffer 集合。
将来开发中,我们常用的有 Arraybuffer 和 Listbuffer。
(3)如果涉及到线程安全,可以使用 syn..开头的集合。
(4)其他的说明参考不可变集合。