可变集合和不可变集合体系 | 学习笔记

简介: 快速学习可变集合和不可变集合体系

开发者学堂课程【Scala核心编程 - 进阶可变集合和不可变集合体系学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9023


可变集合和不可变集合体系


内容介绍:

一、Scala 不可变集合继承关系一览图

二、不可变集合数据结构的应用

三、小结

四、Scala 可变集合一览图


一、Scala 不可变集合继承关系一览图

上一节课提到,scala 分为可变和不可变集合。

首先我们来看以下这张图,非常重要。

image.png

上面这个 transferable 是最顶级的,先不去讨论。Iterable 是最上面的一条,下边都继承了它,Iterable 分为 Set、Map 和 Seq 三个系列。

Seq 是 Iterable 所特有的。Set 和 Map 里面分别有 sortedset 和 Sortedmap,因此它们都具有排序的功能。

Indexedseq 是索引功能,有 range、array、string、NumberRange、Vector,它访问的方式可以通过下标来整合,因此,索引的速度较快。

LinearSeq 叫线性序列,其最大的特点是有头有尾,并且要通过链表来实现。

因此,这些序列一般都要慢一点。但是它的应用性比较强,在我们实际的应用场合中非常多。

比如队列、站,如果遇到有头有尾的,就可以去 LinearSeq 里面去找。


二、不可变集合数据结构的应用

递推中有一个很厉害的项目,叫做汉诺塔。

将它运行起来。

image.png

汉诺塔中可以将 A 塔的东西移动到 C 塔和 B 塔,大概需要二十几步,有一个来回递推的过程,最后 A 塔全部移动到 C 塔中。我们需要注意到代码是怎样编写的。

image.png

来看一个很有趣的队列,我们来写一下这个程序。

image.png

这是四个柜台,要求是有一堆排队的人,按照顺序从排队的人中找出一个人为他服务,服务的时间是随机数,服务完之后就离开大厅,这其实就是一个队列。叫号就可以通过这个来实现。

image.png

以下是它的运行过程。

image.png


三、小结

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变成二的时候,结果就会变成这样

image.png

5.我们发现经典的数据结构,比如 Queue 和 stack 被归属到 LinerSeq。

6.注意,Scala 中的 Map 体系有一个 sortedmap,说明 Scala 的 Map 可以支持排序。

7.IndexedSeq 和 LinearSeq 的区别

IndexedSeq是通过索引来查找和定位,因此速度很快。比如string就是一个索引集合,通过索引即可定位。

LinearSeq是线型的,即有头尾的概念,这种数据结构一般是通过遍历来寻找,它的价值在于应用到一些具体的应用场景中。

遍历是数组加链表的形式。如果同学们对链表熟悉的话是无法深入理解的。

如果想做一个简单的内存哈希结构,一般都用现有的结构。哈希map的结构也是数组加链表的结构,所以推荐大家去看一下链表。

那么链表有什么作用呢?

比如一个即时的通讯软件客户端会发送多个ID,分别编有各自的编号,但是并没有顺序。

要求要把对应ID的状态和对应的好友发给上级,前提是返回的用户的ID是顺序排列的。

数据在网络上传输就会变成字符串,我们要将它有序地拿出来并且不能走数据库应该怎么办呢?

将这些数组组成一个链表,这个问题就可以化解。

具体的应用场景在哪里呢?假设有一个电商网站是做大数据的,做一个推荐系统。要求给用户推荐的商品是最近用户浏览的前十个商品。这时候就可以用队列,从中挑出十个即可。

一般不需要走数据库,因为用数据库速度慢,一般比较脆弱。数据库的优化一般都用缓存。


四、Scala 可变集合一览图

image.png

对上图的说明:

(1)在可变集合中比不可变集合更加丰富。

(2)在 Seq 集合中,增加了 Buffer 集合。

将来开发中,我们常用的有 Arraybuffer 和 Listbuffer。

(3)如果涉及到线程安全,可以使用 syn..开头的集合。

(4)其他的说明参考不可变集合。

相关文章
|
消息中间件 存储 监控
RabbitMQ 面试题及答案整理,最新面试题
RabbitMQ 面试题及答案整理,最新面试题
391 1
|
安全 Android开发
你是否了解 RxJava 的 Disposable ?
你是否了解 RxJava 的 Disposable ?
398 0
|
JavaScript 开发者 UED
事件委托的缺点在什么情况下会被放大?
【10月更文挑战第29天】在复杂的DOM结构、特定的事件处理逻辑以及高兼容性要求等情况下,事件委托的缺点会被放大。开发者在这些场景下使用事件委托时,需要充分考虑其潜在的问题,并采取相应的措施来尽量减少其影响,以确保应用的稳定性和可靠性。
|
10月前
|
人工智能 编解码 自然语言处理
Zonos:油管博主集体转粉!开源TTS神器Zonos爆火:克隆你的声音说5国语言,还能调喜怒哀乐
Zonos 是 ZyphraAI 推出的开源多语言 TTS 模型,支持语音克隆、情感控制和多种语言,适用于有声读物、虚拟助手等场景。
766 18
Zonos:油管博主集体转粉!开源TTS神器Zonos爆火:克隆你的声音说5国语言,还能调喜怒哀乐
|
机器学习/深度学习 自然语言处理
深度学习中的正则化技术:防止过拟合的策略
深度学习模型因其强大的特征提取能力而广受关注,但复杂的网络结构也容易陷入过拟合的困境。本文将探讨如何通过正则化技术来缓解这一问题,包括L1和L2正则化、Dropout、数据增强以及早停等方法。文章将详细解释每种技术的工作原理,并讨论它们在实际应用中的效果与挑战。
|
SQL 存储 算法
比 SQL 快出数量级的大数据计算技术
SQL 是大数据计算中最常用的工具,但在实际应用中,SQL 经常跑得很慢,浪费大量硬件资源。例如,某银行的反洗钱计算在 11 节点的 Vertica 集群上跑了 1.5 小时,而用 SPL 重写后,单机只需 26 秒。类似地,电商漏斗运算和时空碰撞任务在使用 SPL 后,性能也大幅提升。这是因为 SQL 无法写出低复杂度的算法,而 SPL 提供了更强大的数据类型和基础运算,能够实现高效计算。
|
存储 开发框架 .NET
ASP.NET Core SignalR系列之Hub教程
ASP.NET Core SignalR系列之Hub教程
507 0
|
存储 缓存 Linux
Linux文件系统的功能规划
【9月更文挑战第12天】本文通过类比图书馆,形象地解释了文件系统的组织形式和管理方法。首先,文件系统需按块存储文件,并设有索引区方便查找。其次,热点文件应有缓存层提高效率,文件需分类存储以便管理。最后,Linux内核需记录文件使用情况,通过文件描述符区分不同文件,确保文件操作准确无误。
|
存储 程序员
操作系统(10)----从写程序到程序运行
操作系统(10)----从写程序到程序运行
196 1
|
C语言
C语言----随机输入10个数,从小到大依次排列
C语言----随机输入10个数,从小到大依次排列
365 0