Scala集合
一.集合简介
1.Scala集合有三大类:所有集合都扩展自Iterable特质
- Seq:序列——存放单值类型;有序,可重复
- Set:集——存放单值类型;无序,不可重复
- Map:映射——存放键值对;其中key无序,不可重复
下图显示了 scala.collection
中的所有集合,这些都是高级抽象类或特质,它们通常具有可变的和不变的实现:
2.对于所有的集合类scala又同时提供可变与不可变的版本,分别位于以下这两个包:
scala.collection.immutable
scala.collection.mutable
1)Scala不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象,而不会对原对象进行修改:类似于java中的String对象
2)可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象:类似于java中StringBuilder对象
建议:在操作集合的时候,不可变用符号,可变用方法
1.可变集合
下图显示了scala.collection.immutable 中的所有集合:
注意:
1)Set、Map是Java中也有的集合
2)Seq是Java没有的,我们发现List归属到了Seq,因此这里的List就和Java不是同一个概念了
3)String也是属于IndexedSeq(虚线:隐式转换)
4)Map体系有一个SortedMap,说明Scala的Map可以支持排序
5)IndexedSeq和LinearSeq的区别:
- a)IndexedSeq是通过索引来查找和定位,因此速度快,比如String就是一个索引集合,通过索引即可定位
- b)LinearSeq是线性的,即有头尾的概念,这种数据结构一般是通过遍历来查找
6)我们前面的for循环有一个 1 to 3,就是IndexedSeq下的Range
2.不可变集合
下图显示了scala.collection.mutable中的所有集合:
图中说明:
二.数组
Array的继承关系:
- Seq:序列——存放单值类型;有序,可重复
- IndexedSeq:通过索引来查找和定位
ArrayBuffer的继承关系:
1.不可变数组:Array
不可变数组,所以在执行添加或者删除操作的时候,会创建新的数组对象。
有两种创建不可变数组的方式:new 和 apply
1)方式1:通过new Array[ ]( )
- [Int]:是指定可以存放的数据类型,如果希望存放任意数据类型,则指定Any
- (5):表示数组的大小,确定后就不可以变化
- 默认赋值:数值类型——各类0;String——null
方式1:
val arr01 : Array[Int] = new Array[Int](5)
//1.赋值
arr01(0) = 10 //注意:区别于java用的是小括号
arr01.update(0, 1) //采用方法给数组赋值
//2.遍历数组
//(1)查看数组:用指定的字符串连接数组中的元素,形成一个新的字符串
println(arr01.mkString(",")) //10,1,0,0,0
//2)普通for循环:快捷输入 itr
for (i <- arr01) {
println(i)
}
//3)迭代器.iterator
val iterator = arr01.iterator
while (iterator.hasNext){
println(iterator.next())
}
//4)增强for循环:.foreach
// arr01.foreach((i:Int)=>{println(i)})
// arr01.foreach(println(_))
arr01.foreach(println)
//3.增加元素(由于创建的是不可变数组,增加元素,其实是产生新的数组)
val newArr1 = arr01.+:(30)
println(newArr1.mkString(",")) //30,10,1,0,0,0
//在Scala语言中,如果运算符方法中包含冒号,并且冒号在后,运算顺序为从右到左
//val newArr2: Array[Int] = arr01 +: 30 编译报错
val newArr3: Array[Int] = 30 +: arr01
println(newArr3.mkString(",")) //30,10,1,0,0,0
//同理冒号在左边:30添加到末尾
val newArr4 = arr01 :+ 30
println(newArr4.mkString(",")) //10,1,0,0,0,30
2)方式2:通过 Array(1, 2)
- 在定义数组时,直接赋初始值
- 使用apply方法创建数组对象
方式2:
val arr2 : Array[Int] = Array(1,2,3,4,5)
2.可变数组:ArrayBuffer
可变数组,在执行添加或者删除操作的时候,不会创建新的数组对象,直接在源数组上进行操作:
- 包名:
scala.collection.mutable.ArrayBuffer
两种方式:new 和 apply
//方式1:
val arr0: ArrayBuffer[Int] = ArrayBuffer(1,2,3)
//方式2:
val arr = new ArrayBuffer[Int]()
println(arr.length) //0
//1.向数组中添加元素:append方法(),支持可变参数
//建议:在操作集合的时候,不可变用符号,可变用方法
// arr(0) = 20 运行出错:数组中并没有元素
arr.append(10)
arr.insert(1,20)
// arr.insert(5,20) 运行出错:数组长度没有到达索引5位置
println(arr.mkString(",")) //10,20
// arr.update(0,10)