一、集合类型
集合是⼀种用来存储各种对象和数据的容器。Scala 集合分为可变的和不可变的集合。
1. 不可变集合可以安全的并发访问。
2. 可变集合可以在适当的地⽅被更新或扩展。这意味着你可以修改,添加,移除⼀个集合的元素。
Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质,意味着 集合的基本特点是⽀持迭代遍历的。
scala集合两个主要的包:
# 不可变集合
scala.collection.immutable (Scala默认采用不可变集合)
# 可变集合
scala.collection.mutable
分类 | 描述 |
Seq | 序列。元素以线性方式存储,集合中可以存放重复对象。 |
Set | 集(数据集,区别于集合)。集中的对象不按特定的方式排序,并且没有重复对象。 |
Map | ⼀种把键对象和值对象映射的集合,它的每⼀个元素都包含⼀对键对象和值对象。 |
对于可变与不可变集合,Seq、Set、Map又有不同的实现方式,下面两张图详细描述了其继承关系。
1.数组
任何数组都是可变集合
数组包括:Array(定长)和ArrayBuffer(变长)
# Array
- 定长数组,数组不可扩容 scala.Array
# ArrayBuffer
- 变长数组,数组可扩容 scala.collection.mutable.ArrayBuffer
val arr=Array(1,2,3)
val arr1=new Array(100)
scala> arr :+ 4 //+:
res306: Array[Int] = Array(1, 2, 3, 4)
arr是定长数组,不能修改长度,这里是返回新的数组,原数组并没有被修改
# 什么时候用new
如果没有提供object的apply方法时,class必须用new.
定长数组
arr是定长数组,不能改变长度
定⻓数组是不可变集合吗? 不是。定长数组是可变集合的⼀种,内容可变,但是其长度不可变。
# 扩展:为什么定长数组是可变集合?
Array本身不属于scala集合成员,从前⾯类继承图中也可发现这⼀点,在可变集合图中IndexedSeq有⼀条虚线指向了Array,说明并不是直接继承关系。
⼀般将Array归为集合是因为Scala默认将Array隐式转换为WrappedArray,⽽WrappedArray实现了IndexedSeq特质。
从这⼀点上来说,String与WrappedString也有异曲同⼯之妙,可以发现在不可变集合中,String与IndexedSeq也是虚线连接,也就是说在Scala中,String可以当集合处理。参考下⽂中的描述,请⾃⾏通过源码验证。
Array被隐式转换为WrappedArray(scala.collection.mutable.WrappedArray),间接拥有了集合的特征。
//Predef.scala 提示:所有scala⽂件默认导⼊Predef对象
implicit def genericWrapArray[T](xs: Array[T]): WrappedArray[T] =
if (xs eq null) null
else WrappedArray.make(xs)
变长数组 ArrayBuffer
# ArrayBuffer的创建
1)直接创建
2)由Array转化
# 由arr转化 arr.toBuffer
scala> arr.toBuffer
res286: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3)
scala> arr.toBuffer+=4
res287: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3, 4)
scala> res286
res289: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3)
scala> res287
res290: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3, 4)
# 直接创建
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer
scala> val arrBuff=ArrayBuffer(1, 2, 3)
arrBuff: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)
小结:ArrayBuffer是在原来的Buffer上修改.
+: 返回新的对象
+= 是在原对象上修改
Array(1,2,3,4,5).filter(_%2==0).map(_*2).foreach(println)
2 元组
Scala Tuple表示固定元素的组合,元组可以装着多个不同类型的值,是不同类型的值的聚集。Tuple是Scala中⾮常 重要的⼀种数据结构,后⾯会大量使用。其特点包括:
- 最多⽀持22个元素组合,分别对应类型Tuple1~Tuple22,相应也称为⼀元组(⼀般不用)、⼆元组、三元组...
- 元组可以容纳不同类型的元素
- 元组不可变
创建元组:使用小括号 () 将多个元素括起来,元素之间⽤逗号分隔,元素的类型和个数不超过22。
访问组元:使用 _1 , _2 , _3 等形式访问组元,注意下标从1开始。
scala> val stu=(101,"oak","male",24)
s