简介
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、增
不可变数组在新增元素后返回一个新的数组。
//给数组新增加元素 5 val 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
//创建一个List val list: List[Int] = List(1,2,5,4,3) //创建一个空List val emptyList: List[Int] = Nil //可以存放不同数据类型的数据 排序时安照字典序排序 val li = List("s",2,5,1.6)
2、在列表头部追加元素
//在list头部追加数 0 val 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") //想要存放任意数据类型就设为 Any val 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