Scala 集合概述
① Scala同时支持不可变集合和可变集合,不可变集合可以安全的并发访问
② Scala集合中两个主要的包: 可变集合: scala.collection.mutable 不可变集合:scala.collection.immutable
③ Scala默认采用不可变集合,对于几乎所有的集合类,Scala都同时提供了可变(mutable)和不可变(immutable)的版本
④ Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质,在Scala中集合有可变(mutable)和不可变(immutable)两种类型
可变集合和不可变集合举例
① 可变集合:可变集合,就是这个集合本身可以动态变化的,比如:ArrayList , 是可以动态增长的。scala.collection.mutable 包中的集合类声明后则是可变的,这里的可变指的是原集合本身的可变,所以处理可变集合意味着你需要去理解哪些代码的修改会导致集合同时改变。
② 不可变集合:Scala不可变集合,就是这个集合本身不能动态变化,类似java的数组,是不可以动态增长或缩减的。scala.collection.immutable 包中的集合类声明后是不可变的,这个不可变对引用类型而言就是指的引用地址不可变,例如一个集合创建之后将不会改变,可以对该集合实现添加、移除或修改等操作,但是该操作不是修改了原集合的值,而是返回了一个新的集合将原集合的值经过操作后的值放入新集合返回给你而已,原集合值还是没有改变。
不可变集合继承层次一览
不可变集合小结:
① Set、Map是Java中也有的集合,而Seq是Java没有的,我们发现List归属到Seq了,因此Scala中的List就和java中的List不是同一个概念了
② 我们前面的for循环有一个 1 to 3,就是IndexedSeq 下的Vector,String也是属于IndexeSeq
③ 我们发现经典的数据结构,比如Queue 和 Stack被归属到LinearSeq
④ 大家注意Scala中的Map体系有一个SortedMap,说明Scala的Map也可以支持排序
⑤ IndexSeq 和 LinearSeq 的区别,IndexSeq是通过索引来查找和定位,因此速度快,比如String就是一个索引集合,通过索引即可定位,而LineaSeq 是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找,它的价值在于应用到一些具体的应用场景 (电商网站,大数据推荐系统 :最近浏览的10个商品)
Scala可变集合继承关系一览图
1.Scala 数组
1.1 数组-定长不可变数组(声明泛型)
在Scala中,Array代表的含义与Java中类似,也是长度不可改变的数组,但内容可以修改。此外,由于Scala与Java都是运行在JVM中,双方可以互相调用,因此Scala数组的底层实际上是Java数组。例如字符串数组在底层就是Java的String[],整数数组在底层就是Java的Int[]。
1) 声明方式一:
//声明一个长度为5,泛型为Int类型的数组,这种方式必须指定具体的泛型类型
val arr = new Array[Int](5)
2)声明方式二:
val arr = Array(1,2,"a",true)
通过Array(数组元素)方式声明数组,相当于调用了Array类的apply方法new了一个数组,然后对其赋值返回,这种方式可以不用指定泛型,可以添加不同类型的元素,因为这种方式默认是调用Array类中的apply方法,这个apply方法有很多指定好的参数具体数据类型的重载方法,例如:def apply(x: Int, xs: Int*): Array[Int],但其中有一个def apply[T: ClassTag](xs: T*): Array[T]={}方法,该方法没有指定泛型的具体类型,所以使用这种方式定义数组时,可以