简介
Scala的集合类型和Java差不多,也有三类:序列Seq(对应Java的LIst)、集合Set(对应Java的Set)、映射Map(对应Java的Map),他们都扩展了(with)Iterable 这个特质。
对于几乎所有的集合类, Scala 都同时提供了 可变 和 不可变 的版本,分别位于以下两
个包
- import scala.collection.immutable.Seq
-
import scala.collection.mutable.Seq
不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象,而
不会对原对象进行修改。类似于 java 中的 String 对象。
可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象。类似
于 java 中 StringBuilder 对象。
为什么要有可变和不可变这两种集合?
Scala之所以同时提供可变和不可变集合类型,是为了满足不同的编程需求和场景。
不可变集合类型在Scala中是默认的选择,它们具有以下优点:
- 线程安全:不可变集合是线程安全的,因为它们的内容在创建后不可更改。这使得在并发环境中使用不可变集合更加可靠和安全。
- 可重复使用:不可变集合可以在多个地方共享和重用。它们不会被意外的修改,从而减少了出错的可能性。
- 简单和可预测:不可变集合的行为是可预测和稳定的,因为它们的内容不会发生变化。这有助于编写更容易理解和维护的代码。
然而,有时候我们需要在程序中进行修改和更新集合的操作。这时候可变集合类型就派上用场了,它们具有以下优点:
- 更高的性能:可变集合在插入、删除和更新元素时通常具有更高的性能,尤其是对于大型数据集合。
- 可变状态修改:在某些场景下,处理可变集合可以更直观和方便。例如,在迭代和逐步构建集合的过程中,可变集合提供了更灵活的操作方式。
- 与Java互操作性:与Java集合库相比,可变集合更易于对接和交互操作,因为它们更接近于Java中的集合类型。
1、数组
1.1 不可变数组 Array
1、定义数组
可指定数组类型或者不指定(默认类型Any,即数组可以存放任何数据类型的数据)
//1. 初始化数组var arr:Array[Int] = Array(1,2,3,4,5)//2.在Scala中,默认的数组类型是Array[Any] 因此在不指定数组类型的时候可以存储任何数据类型val arr0 = Array(1,0.1,"hello",'c')//3. 声明数组但不赋值val arr1 = new Array[Int](10)
2、改
//2.1 直接修改某个索引对应的值arr1(0) = 1
//2.2 修改指定索引的值arr1.update(0,2)
3、增
不可变数组在新增元素后返回一个新的数组。
//给数组新增加元素 5val arr2:Array[Int] = arr1 :+ 5
4、打印数组
//1.遍历数组打印
for(i <- arr)println(i)//2.传递函数打印
arr.foreach(println)//2.1 自定义函数做参数打印
def printItem(i: Int): Unit = print(i + " ")
arr.foreach(printItem)//3.快捷打印
println(arr.mkString(","))
1.2 可变数组 ArrayBuffer
1、定义可变数组
//1.1 指定可变数组的数据类型val arr: ArrayBuffer[Int] = ArrayBuffer(1,2,3,5)
//1.2 不指定可变数组的数据类型val arr0 = ArrayBuffer(1,1.5,"scala",'w')//1.3 只声明不初始化 需要指定类型但不需要指定长度val arr1 = new ArrayBuffer[Int]()
2、增
//2.增加元素arr0.append("spark")arr0.+=(5)
3、删
//5.删除元素arr0.remove(0)
4、改
//4.修改元素arr0(2) = 5
5、插入
//3.插入元素arr0.insert(3,"hbase")
1.3、可变数组和不可变数组的转换
1、可变数组 => 不可变数组
//可变数组转为不可变数组
val arr: ArrayBuffer[Int] = ArrayBuffer(1,2,3,5)val new_arr = arr.toArray
2、不可变数组 => 可变数组
//不可变数组转为可变数组var arr:Array[Int] = Array(1,2,3,4,5)val new_arr = arr.toBuffer
1.4、多维数组
1、声明
//声明一个3x4的数组 即3个长度为4的一维数组val arr = Array.ofDim[Int](3,4)
2、打印多维数组
for (i <- arr){for (j <- i){print(j + " ")}println()}
2、列表
Scala中的列表可以存放不同数据类型的数据 排序时安照字典序排序
2.1、不可变列表 List
List 是集合 Seq 下的一个集合类型,它默认是不可变集合。
1、声明创建一个List
//创建一个Listval list: List[Int] = List(1,2,5,4,3)//创建一个空Listval emptyList: List[Int] = Nil//可以存放不同数据类型的数据 排序时安照字典序排序val li = List("s",2,5,1.6)
2、在列表头部追加元素
//在list头部追加数 0val ll = 0::list
3、在列表头部追加列表
//将列表list1添加到list头部val list1:List[Int] = List(5,6,5)val l2 = list1:::list
4、打印列表
//1.
println(list.mkString(","))
//2.
list.foreach(println)
5、列表排序
//返回一个排好序的List集合val sorted = list.sorted
2.2、可变列表 ListBuffer
1、创建一个可变集合
val list0 = ListBuffer(1,2,5,4,8)//可以存放不同数据类型的数据 排序时安照字典序排序val list = ListBuffer(1,1.2,"s")//想要存放任意数据类型就设为 Anyval buffer = ListBuffer.empty[Int]
2、向集合中添加数据
//添加数据buffer.append(5)
//指定位置插入数据buffer.insert(0,2)
3、打印集合
println(buffer.mkString(","))buffer.foreach(println)
4、修改数据
buffer(0) = 6
5、删除数据
//删除指定元素buffer.-=(5)//通过下标索引来删除元素buffer.remove(0)
3、Set 集合
默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用 scala.collection.mutable.Set 包。
mutable.Set 默认是乱序的,如果想要有序可以用链式的LinedHashSet。
3.1、不可变 Set
val set = Set(1,1,2,2,3,3)println(set.mkString(",")) //1,2,3
3.2、可变Set mutable.Set
声明集合
val set = mutable.Set(1,2,3,4,5,6)
删除指定元素
由于Set集合默认是无序的,所以也就没有通过下标删除元素的方法,它可以直接删除指定元素。
//删除指定元素set-=(7)//删除指定元素set.remove(8)
打印集合
println(set) //Set(1,5,2,6,3)
println(set.mkString(",")) //1,5,2,6,3,4