Scala 中集合的基本介绍
1)Scala 同时支持 不可变集合 和 可变集合 ,不可变集合可以安全的并发访问
2)两个主要的包:
scala.collection.immutable (不可变集合)
scala.collection.mutable (可变集合)
3)Scala 默认采用不可变集合,对于几乎所有的集合类,Scala 都同时提供了可变(mutable)和不可变(immutable)的版本
4)Scala 的集合有三大类:
序列 Seq
集 Set
映射 Map
所有的集合类都扩展自 Iterable 特质
不可变集合继承层次一览图
小结:
可变集合继承层次一览图
数组
定长数组
第一种方式定义数组:
Scala :val arr = new Array[Int] (4)
Java :int [] arr = new int[4]
第二种方式定义数组:
遍历方式:
ArrayBuffer
变长数组(声明泛型)
Array 和 ArrayBuffer 相互转换
多维数组
定义:
var arr = Array.ofDim[Double] (m,n)
遍历:
Scala 数组 与 Java 的 List 的互转
Java 的 List 转 Scala 的 Buffer
注意:因为我看的视频是17年的,因为Scala 的更新,上面的代码语法可能已经失效,这一部分我也没有尝试。
元组 Tuple
元组也可以理解为一个容器
可以存放各种相同或者不同类型的数据
简单点说:就是将多个无关的数据封装为一个整体,称为元组,最多的特点就是灵活,对数据没有太多约束
注:元组中最大只能放 22 个元素
元组的类型取决于有多少个元素,
访问元组:
1)顺序号(_顺序号) 从1开始
2)索引 (productElement)从0开始
元组的遍历
注意,元组的遍历需要用到迭代器
List
Scala 中的 List 与 Java 中的 List 不一样。Java 中 List 是一个接口,真正存放数据是 ArrayList, Scala 的 List 可以直接存放数据,就是一个 object。
默认情况下 Scala 的 List 是不可变的。 List 属于 序列 Seq。
Nil 空集合
List 中元素的追加
向列表中增加元素,会返回新的列表/集合对象。
注意:Scala 中List 元素的追加不同于 Java
1》在列表的最后增加数据
val list2 = list1 :+ 4
2》在列表的最前面增加数据
val list3 =0 +: list1
3》在列表的最后增加数据
:: 的使用
::: 的使用
::: 两边都要为集合
ListBuffer
listBuffer 是可变的 list 集合
删除元素
Queue 队列
说明
1)队列是一个有序列表,在底层可以用数组或是链表来实现
2)其输入和输出要遵循 先入先出 的原则。
即:先存入队列的数据,要先取出。后存入的要后取出
3)在Scala中,由设计者直接给我们提供队列类型使用。
4)在scala中, 有 scala.collection.mutable.Queue 和 scala.collection.immutable.Queue , 一般来说,我们在开发中通常使用可变集合中的队列。
队列创建:
var queue = new mutable.Queue[Int]
添加元素:
入队列: dequeue()
默认从队列尾入队列
出队列:enqueue(),可以添加多个
默认从队列头出队列
返回队列元素
queue.head
queue.last
queue.tail
Map
Java Map 回顾:
HashMap 是一个散列表(数组+链表),它存储的内容是键值对(key-value)映射,Java中的HashMap是无序的,key不能重复。
Scala 中 Map 介绍:
1)Scala中的Map 和Java类似,也是一个散列表,它存储的内容也是键值对(key-value)映射,
Scala中不可变的Map是有序的,可变的Map是无序的。(默认是不可变的)
2)Scala中,有可变Map (scala.collection.mutable.Map) 和 不可变
Map(scala.collection.immutable.Map)
构建Map
构造不可变映射
下面的输出顺序和声明顺序一致
构造可变映射
需要指定可变Map 的包
下面的输出顺序和声明顺序不一致
构造空映射
对偶元组
Map 取值操作
1)使用 map(key)
如果key存在,则返回对应的值
如果key不存在,则抛出异常[java.util.NoSuchElementException]
在Java中,如果key不存在则返回null
2)使用contains方法检查是否存在key
返回Boolean
1.如果key存在,则返回true
2.如果key不存在,则返回false
map4.contains(“B”)
3)使用map.get(key).get取值
通过 映射.get(键) 这样的调用返回一个Option对象,要么是Some,要么是None
说明和小结:
map.get方法会将数据进行包装
如果 map.get(key) key存在返回some,如果key不存在,则返回None
如果 map.get(key).get key存在,返回key对应的值,否则,抛出异常 java.util.NoSuchElementException: None.get
4)-使用map4.getOrElse()取值
getOrElse 方法 : def getOrElse[V1 >: V] (key: K, default: => V1)
说明:
如果key存在,返回key对应的值。
如果key不存在,返回默认值。在java中底层有很多类似的操作。
⭐⭐⭐⭐⭐
如何选择取值方式建议
如果我们确定map有这个key ,则应当使用map(key), 速度快
如果我们不能确定map是否有key ,而且有不同的业务逻辑,使用map.contains() 先判断在加入逻辑
如果只是简单的希望得到一个值,使用map4.getOrElse(“ip”,“127.0.0.1”)
Map的修改
前提:Map 是可变的
Map添加元素
添加的元素存在时,就是更新
Map 删除元素
注意:
定义Map 的时候要注意 类型是 var 还是 val
当是 var 类型时:
当时 val 类型时:
Map 的遍历
Set
集是不重复元素的结合。集不保留顺序,默认是以哈希集实现
Java 回顾:
Java中,HashSet是实现Set接口的一个实体类,数据是以哈希表的形式存放的,里面的不能包含重复数据。Set接口是一种不包含重复元素的 collection,HashSet中的数据也是没有顺序的。
Scala 中:
默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用 scala.collection.mutable.Set 包
创建:
val set1 = Set(1,2,3)//不可变
println(set1)
val set2 = mutable.Set(1,2,3)//可变
println(set2)
添加:
删除
遍历:
Set 更多操作
-----韩顺平老师Scala笔记