目录
1.集合简介
1.1scala的集合有三大类:
1.2不可变集合关系一览:
IndexedSeq 和 LinearSeq 的区别:
1.3可变集合关系继承图:
2.数组
2.1不可变数组(Array)
2.2可变数组(ArrayBuffer)
2.3不可变数组和可变数组的转换
2.4多维数组
3.列表List
3.1不可变List
3.2可变ListBuffer
4.Set集合
4.1不可变Set
4.2可变mutableSet
5.Map集合
5.1不可变Map
5.2可变Map
6.元组
序列Seq,集Set,映射Map,所有的集合都扩展至Iterable特质
对于几乎所有的集合类,Scala 都同时提供了可变和不可变的版本,分别位于以下两 个包
不可变集合:scala.collection.immutable
可变集合:scala.collection.mutable
Scala 不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象,而 不会
对原对象进行修改。类似于 java 中的 String 对象
可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象。类似 于 java 中 StringBuilder 对象
建议:操作集合时,不可变用操作符,可变用方法。操作符也不一定就会返回新对象,但大多是这样的,还是要具体看。
scala中集合类的定义比java要清晰不少
set和map是java中本来就有的,哈希表和二叉树实现是肯定都有的,seq是java没有的,List归属到seq了,则scala的list和java的list不是一个概念
IndexSeq下的range可以写成for循环中的1 to 3 也就是隐式转换加上方法调用
scala中的String就是java.lang.String,和集合无直接关系,所以是虚箭头,是通过Perdef中的低优先级隐式转换来做到的。经过隐式转换为一个包装类型后就可以当做集合,Array和string类似。
大家注意 Scala 中的 Map 体系有一个 SortedMap,说明 Scala 的 Map 可以支持排序
(1)IndexedSeq 是通过索引来查找和定位,因此速度快,比如 String 就是一个索引集合,通过索引即可定位
(2)LinearSeq 是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找
此类包装为了兼容java在scala中非常常见,scala中很多类型就是对java类型的包装或者仅仅是别名。
scala中可能会推荐更多地使用不可变集合。能用不可变就用不可变。
整体结构差不多,在序列中多了一个Buffer
不可变和可变:
- 不可变指的是对象大小不可变,但是可以修改元素的值(不能修改那创建了也没有用对吧),需要注意这一点。而如果用了val不变量存储,那么指向对象的地址也不可变。
- 不可变集合在原集合上个插入删除数据是做不到的,只能返回新的集合。
泛型:
- 集合类型大多都是支持泛型,使用泛型的语法是[Type],不同于java的
。
分为两种定义方式:
第一种:
案例:
第二种:
案例:
定义变长数组 val arr01 = ArrayBuffer[Any](3, 2, 5)
(1)[Any]存放任意数据类型
(2)(3, 2, 5)初始化好的三个元素
(3)ArrayBuffer 需要引入 scala.collection.mutable.ArrayBuffer
案例:
(1)ArrayBuffer 是有序的集合
(2)增加元素使用的是 append 方法(),支持可变参数
arr1.toBuffer //不可变数组转可变数组
arr2.toArray //可变数组转不可变数组
(1)arr2.toArray 返回结果才是一个不可变数组,arr2 本身没有变化
(2)arr1.toBuffer 返回结果才是一个可变数组,arr1 本身没有变化
案例:
二维数组:就是数组的数组
案例:
(1)List 默认为不可变集合
(2)创建一个 List(数据有顺序,可重复)
(3)遍历 List
(4)List 增加数据
(5)集合间合并:将一个整体拆成一个一个的个体,称为扁平化
(6)取指定数据
(7)空集合 null
案例:
总结:
List,抽象类,不能直接new,使用伴生对象apply传入元素创建。
List本身也有apply能随机访问(做了优化),但是不能update更改。
foreach方法遍历。
支持+: :+首尾添加元素。
Nil空列表,::添加元素到表头。
常用Nil.::(elem)创建列表,换一种写法就是10 :: 20 :: 30 :: Nil得到结果List(10, 20, 30),糖是真滴多!
合并两个列表:list1 ::: list2 或者list1 ++ list2。
(1)创建一个可变集合 ListBuffer
(2)向集合中添加数据
(3)打印集合数据
案例:
总结:
可变列表ListBuffer,和ArrayBuffer很像。
final的,可以直接new,也可以伴生对象apply传入元素创建(总体来说scala中更推荐这种方式)。
方法:append prepend insert remove
添加元素到头或尾:+=: +=
合并:++得到新的列表,++=合并到源上。
删除元素也可以用-=运算符。
具体操作很多,使用时阅读文档即可。
默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用
scala.collection.mutable.Set 包
案例:
总结:
数据无序,不可重复。
可变和不可变都叫Set,需要做区分。默认Set定义为immutable.Set别名。
创建时重复数据会被去除,可用来去重。
添加元素:set + elem
合并:set1 ++ set2
移除元素:set - elem
不改变源集合。
案例:
操作基于源集合做更改。
为了与不可变集合区分,import scala.collection.mutable并用mutable.Set。
不可变集合有的都有。
添加元素到源上:set += elem add
删除元素:set -= elem remove
合并:set1 ++= set2
都很简单很好理解,多看文档和源码就行。
Scala 中的 Map 和 Java 类似,也是一个散列表,它存储的内容也是键值对(key-value) 映射
案例:
案例:
元组可以理解为一个容器,可以存放各种相同或者不同类型的数据,也就是将无关的数据封装为一个整合体。
注意:元组最大只能有22个元素。swap方法可以将只有两个元素的一个元组其中内容相互调换
案例: