开发者学堂课程【Scala核心编程 - 进阶:Scala 集合基本介绍】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9022
Scala 集合基本介绍
内容介绍:
一、Scala集合的基本特点
二、可变集合和不可变集合
集合包含了数据结构,比如说队列以及集合本身都是一种数据结构,在本节课主要讲的是数据结构的应用。
一、Scala 集合的基本特点
1.Scala 同时支持不可变集合和可变集合,不可变集合可以安全地并发访问
为什么Scala的设计者要同时设计不可变集合和可变集合两大类呢?
因为不可变集合是并发安全的,它只有读的操作,这对于线程安全带底层操作而言就会相对简单一些,同时效率就会更高一些。换言之,我们需要要优先使用不可变集合。
而对于可变集合,有些数组就是需要变化,比如有十个位置,然后一个数组来了之后,我们需要减少一些位置,就需要变化。
两个主要的包:
不可变集合:scala.collection.immutable
可变集合:scala.collection.mutable
2.Scala 默认采用不可变集合,对于几乎所有的集合类,Scala 都同时提供了可变和不可变的版本。
3.Scala 的集合有三大类:
序列 Seq、集 Set、映射 Map,所有的集合都扩展自 Iterable 特质。在 Scala 集合中有可变和不可变两种类型。
Iterable 特质
打开一个文档手册,找一个list相关的,看一下list的继承关系,发现有一个lterable。这个Iterable就是从上面继承出来的,找多个list都是如此。
二、可变集合和不可变集合
1.不可变集合
不可变集合:Scala 不可变集合,就是这个集合本身不能动态变化。(类似 Java 的数组,是不可以动态增长的。)
不可变集合类似 Java 的数组:
Int[]nums=new int[3];
Java 里引进一个数组之后,这个数组的大小是固定的。数组的大小只能是三个元素。因此,在这儿提到的不能动态变化,主要是指集合本身不能动态变化。内容可以变化但集合不可以变化。
Nums[2]=11;//?
//nums[3]=90;//?
String[] names={“bj”,”sh”};
System.out.printin(nums+””+names);
在这里,重点强调集合本身不会发生变化,因为到后边我们会发现不可变集合可以进行加减运算,但是它本身不能变化。
2.可变集合
可变集合:可变集合,就是这个集合本身可以动态变化的,(比如 ArrayList,是可以动态增长的)
可变集合举例:
ArrayList al=new ArrayList();
al add(“zs”);
al add(“zs2”);
System.out.printin(al+””+al.hashcode());//地址
3.以 Java 作为例子举例
新建一个章节,取名叫chapter10。
在chapter10下面新建一个小文件,我们现在所讲的是一个快速入门案例。
以下的代码是非常容易的,因此就不再赘述,直接复制粘贴整理即可。
Import java.util.ArrayList;
Public class Java collection(
Public static void main(string[] args){
//不可变集合类似 Java 的数据
Int[]nums=new int [3]
nums[2]=11;//?
//nums[3]=90;//?
String[] names={“bj”,”sh”};
System.out.printin(nums+””+names);
//可变集合举例
ArrayList al=new ArrayList();
al add(“zs”);
al add(“zs2”);
System.out.println(al+””+al.hashcode());//地址
al.add(“zs3”);
System.out.println(al+””+al.hashcode());//地址
首先我们来看不可变,数组一旦定下来过后,就不能像上图这样写。图中你的本意是给它的第四空间赋一个90,但此时就会报错,系统会告诉你数字越界。
但是并不是内容不能变,比如说不可变集合,内容本来是11,将它变成22。这个操作是可以的。
//不可变集合类似java的数组
Int[]nums=new int[3];
Nums[2]=11;//?
nums[2]=22;//?
我们再来看可变集合的概念,一个 list 的集合,里面放 string 内心。我们可以加任意个数据。而且一旦加了之后,Hash code 也会发生变化。
//可变集合举例
ArrayList al=new ArrayList();
al add(“zs”);
al add(“zs2”);
System.out.println(al+””+al.hashcode());//地址
al.add(“zs3”);
System.out.println(al+””+al.hashcode());//地址
比如,原先的 al 加了两个数据进去,再来看 hash code 的地址是,试运行一下。
ArrayList al=new ArrayList();
al add(“zs”);
al add(“zs2”);
System.out.println(al+”地址=”+al.hashcode());//地址
hash code 的值:[zs,zs2]地址=242625
重新加一个数据库。加了之后,我们再来看地址是否发生变化。
ArrayList al=new ArrayList();
al add(“zs”);
al add(“zs2”);
System.out.println(al+”地址=”+al.hashcode());//地址
al.add(“zs3”);
System.out.println(al+”地址=”+al.hashcode());//地址
此时它的例子发生了变化。这说明它的底层会开辟一个空间,把东西扔进去,因此本身就发生了变化。
[zs,zs2]地址=242625
[zs,zs2,zs3]地址2=7642233