1、Scala集合基本介绍
1.1 有关Scala集合的几个重点
-
Scala同时支持不可变集合和可变集合,可变集合可以安全的并发访问。
-
两个主要的包:不可变集合:scala.collection.immutable。可变集合:scala.collection.mutable。
-
Scala默认采用不可变集合,对于几乎所有的集合类,Scala都同时提供了可变和不可变的版本。
-
Scala集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质。
1.2 可变集合和不可变集合
-
不可变集合:Scala不可变集合,就是这个集合本身不能动态变化(类似Java数组,是不可以动态增长的)
-
可变集合:就是这个集合本身可以动态变化的(比如:ArrayList,是可以动态增长的)
1.3 不可变集合继承结构
1.4不可变集合的小结
-
Set、Map是Java中也有的集合
-
Seq是Java没有的,我们发现List归属到Seq了,因此这里的List就和java不是同 一个概念了
-
我们前面的 for 循环有一个 1 to 3 ,就是 IndexedSeq 下的 Vector
-
String 也是属于 IndexeSeq
-
大家注意 Scala 中的 Map 体系有一个 SortedMap,说明 Scala 的 Map 可以支持 排序
-
我们发现经典的数据结构比如 Queue 和 Stack 被归属到 LinearSeq
-
IndexSeq 和 LinearSeq 的区别[IndexSeq 是通过索引来查找和定位,因此速度快,比如 String 就 是一个索引集合,通过索引即可定位] [LineaSeq 是线型的,即有头尾的概念,这种数据结构一般是通 过遍历来查找,它的价值在于应用到一些具体的应用场景 (电商网站, 大数据推荐系统 :最近浏览的 10 个商品)
1.5 可变集合的继承结构
1.6 对可变集合的说明
-
在可变集合中比不可变集合更加丰富。
-
在Seq集合中,增加了buffer类型,将来开发中常用的有ArrayBuffer和ListBuffer。
-
如果涉及到线程安全,可以选择使用syn开头的集合。
-
其他说明可以参考不可变集合。
2、数组
这里的数组等同于Java中的数组,中括号的类型就是数组的范型。
2.1 定长数组
2.1.1 第一种方式定义数组
//1. 创建了一个 Array 对象,
//2. [Int] 表示泛型,即该数组中,只能存放 Int
//3. [Any] 表示 该数组可以存放任意类型
//4. 在没有赋值情况下,各个元素的值 0
//5. arr01(3) = 10 表示修改 第 4 个元素的值
val arr1 = new Array[Int](10) //
arr1.length
println("arr01(0)=" + arr01(0)) // 0
//数据的遍历
for (i <- arr01) {
println(i)
}
println("--------------------“)
arr01(3) = 10 //
for (i <- arr01) {
println(i)
}
2.1.2 第二种定义数组
package com.atguigu.chapter10
object ArrayDemo02 {
def main(args: Array[String]): Unit = {
//说明
//1. 使用的是 object Array 的 apply
//2. 直接初始化数组,这时因为你给了 整数和 "", 这个数组的泛型就 Any
//3. 遍历方式一样
var arr02 = Array(1, 3, "xx")
arr02(1) = "xx"
for (i <- arr02) {
println(i)
}
//可以使用我们传统的方式遍历,使用下标的方式遍历
for (index <- 0 until arr02.length) {
printf("arr02[%d]=%s", index , arr02(index) + "\t”)
}
}
}
2.2 变长数组
2.2.1 基本使用
package com.atguigu.chapter10
import scala.collection.mutable.ArrayBuffer
object ArrayBufferDemo01 {
def main(args: Array[String]): Unit = {
//创建 ArrayBuffer
val arr01 = ArrayBuffer[Any](3, 2, 5)
//访问,查询
//通过下标访问元素
println("arr01(1)=" + arr01(1)) //
arr01(1) = 2
//遍历
for (i <- arr01) {
println(i)
}
println(arr01.length) //3
println("arr01.hash=" + arr01.hashCode())
//修改 [修改值,动态增加]
//使用 append 追加数据 ,append 支持可变参数
//可以理解成 java 的数组的扩容
arr01.append(90.0,1