scala集合

目录

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.元组


1.集合简介

 1.1scala的集合有三大类:

序列Seq,集Set,映射Map,所有的集合都扩展至Iterable特质

  对于几乎所有的集合类,Scala 都同时提供了可变和不可变的版本,分别位于以下两 个包

      不可变集合:scala.collection.immutable

      可变集合:scala.collection.mutable

  Scala 不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象,而 不会

对原对象进行修改。类似于 java 中的 String 对象

  可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象。类似 于 java 中 StringBuilder 对象

建议:操作集合时,不可变用操作符,可变用方法。操作符也不一定就会返回新对象,但大多是这样的,还是要具体看。

scala中集合类的定义比java要清晰不少

1.2不可变集合关系一览:

 

scala集合_第1张图片

setmapjava中本来就有的,哈希表和二叉树实现是肯定都有的,seqjava没有的,List归属到seq了,则scalalistjavalist不是一个概念

IndexSeq下的range可以写成for循环中的1 to 3 也就是隐式转换加上方法调用

scala中的String就是java.lang.String,和集合无直接关系,所以是虚箭头,是通过Perdef中的低优先级隐式转换来做到的。经过隐式转换为一个包装类型后就可以当做集合,Arraystring类似。

大家注意 Scala 中的 Map 体系有一个 SortedMap,说明 Scala 的 Map 可以支持排序

IndexedSeq 和 LinearSeq 的区别:

(1)IndexedSeq 是通过索引来查找和定位,因此速度快,比如 String 就是一个索引集合,通过索引即可定位

(2)LinearSeq 是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找

此类包装为了兼容java在scala中非常常见,scala中很多类型就是对java类型的包装或者仅仅是别名。

scala中可能会推荐更多地使用不可变集合。能用不可变就用不可变。

 

1.3可变集合关系继承图:

scala集合_第2张图片

整体结构差不多,在序列中多了一个Buffer

2.数组

不可变和可变:

  • 不可变指的是对象大小不可变,但是可以修改元素的值(不能修改那创建了也没有用对吧),需要注意这一点。而如果用了val不变量存储,那么指向对象的地址也不可变。
  • 不可变集合在原集合上个插入删除数据是做不到的,只能返回新的集合。

泛型:

  • 集合类型大多都是支持泛型,使用泛型的语法是[Type],不同于java的

2.1不可变数组(Array

分为两种定义方式:

第一种:

scala集合_第3张图片

案例:

scala集合_第4张图片

scala集合_第5张图片

第二种:

scala集合_第6张图片

案例:

scala集合_第7张图片

2.2可变数组(ArrayBuffer

定义变长数组 val arr01 = ArrayBuffer[Any](3, 2, 5)

(1)[Any]存放任意数据类型

(2)(3, 2, 5)初始化好的三个元素

(3)ArrayBuffer 需要引入 scala.collection.mutable.ArrayBuffer

案例:

(1)ArrayBuffer 是有序的集合

(2)增加元素使用的是 append 方法(),支持可变参数

scala集合_第8张图片

scala集合_第9张图片

2.3不可变数组和可变数组的转换

arr1.toBuffer //不可变数组转可变数组

 arr2.toArray //可变数组转不可变数组

(1)arr2.toArray 返回结果才是一个不可变数组,arr2 本身没有变化

(2)arr1.toBuffer 返回结果才是一个可变数组,arr1 本身没有变化

案例:

scala集合_第10张图片

2.4多维数组

scala集合_第11张图片

二维数组:就是数组的数组

案例:

scala集合_第12张图片

3.列表List

3.1不可变List

(1)List 默认为不可变集合

(2)创建一个 List(数据有顺序,可重复)

(3)遍历 List

(4)List 增加数据

(5)集合间合并:将一个整体拆成一个一个的个体,称为扁平化

(6)取指定数据

(7)空集合 null

案例:

scala集合_第13张图片

总结:

List,抽象类,不能直接new,使用伴生对象apply传入元素创建。

List本身也有apply能随机访问(做了优化),但是不能update更改。

foreach方法遍历。

支持+: :+首尾添加元素。

Nil空列表,::添加元素到表头。

常用Nil.::(elem)创建列表,换一种写法就是10 :: 20 :: 30 :: Nil得到结果List(10, 20, 30),糖是真滴多!

合并两个列表:list1 ::: list2 或者list1 ++ list2

3.2可变ListBuffer

(1)创建一个可变集合 ListBuffer

(2)向集合中添加数据

(3)打印集合数据

案例:

scala集合_第14张图片

总结:

可变列表ListBuffer,和ArrayBuffer很像。

final的,可以直接new,也可以伴生对象apply传入元素创建(总体来说scala中更推荐这种方式)。

方法:append prepend insert remove

添加元素到头或尾:+=: +=

合并:++得到新的列表,++=合并到源上。

删除元素也可以用-=运算符。

具体操作很多,使用时阅读文档即可。

4.Set集合

默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用

scala.collection.mutable.Set 包

4.1不可变Set

scala集合_第15张图片

案例:

scala集合_第16张图片

总结:

数据无序,不可重复。

可变和不可变都叫Set,需要做区分。默认Set定义为immutable.Set别名。

创建时重复数据会被去除,可用来去重。

添加元素:set + elem

合并:set1 ++ set2

移除元素:set - elem

不改变源集合。

4.2可变mutableSet

scala集合_第17张图片

案例:

scala集合_第18张图片

scala集合_第19张图片

操作基于源集合做更改。

为了与不可变集合区分,import scala.collection.mutable并用mutable.Set

不可变集合有的都有。

添加元素到源上:set += elem add

删除元素:set -= elem remove

合并:set1 ++= set2

都很简单很好理解,多看文档和源码就行。

5.Map集合

Scala 中的 Map 和 Java 类似,也是一个散列表,它存储的内容也是键值对(key-value) 映射

5.1不可变Map

scala集合_第20张图片

案例:

scala集合_第21张图片

5.2可变Map

scala集合_第22张图片

案例:

scala集合_第23张图片

6.元组

元组可以理解为一个容器,可以存放各种相同或者不同类型的数据,也就是将无关的数据封装为一个整合体。

注意:元组最大只能有22个元素。swap方法可以将只有两个元素的一个元组其中内容相互调换

案例:

scala集合_第24张图片

你可能感兴趣的:(scala,java,开发语言)