文章目录
- scala集合基本介绍
- 定长数组
- 变长数组
- 定长数组与变长数组转换
- 多维数组定义和使用
- scala数组和javaList的转换
- 元组Tuple
scala集合基本介绍
1)Scala同时支持不可变集合和可变集合,不可变集合可以安全的并发访问
不可变集合包:scala.collection.immutable
可变集合包:scala.collection.mutable
2)对于几乎所有的集合类,Scala都提供了可变和不可变两种版本,Scala默认采用不可变集合
3)Scala集合有三大类:序列 Seq(有序的)、集Set、映射 Map。所有的集合都扩展自Iterable特质
4)不可变集合:scala中的不可变集合就是这个集合本身不能动态变化,类似java中的数组 长度不能动态增加
5)可变集合:就是这个集合本身可以动态变化,类似 java中的 ArrayList
不可变集合类图
总结
1)Set Map 是Java中也有的集合
2)Seq是java中没有的,Scala中List 被归到了Seq下,因此和java中的list 不同
3)String 也属于IndexedSeq
4)经典数据结构Queue Stack 被归属到 LinearSeq
5)Scala集合中 有个 sortedMap 说明 scala中的map支持排序
6)indexedSeq 和LinearSeq的区别是通过所以来查找和定位,因此速度快(String 就是一个索引集合),LinearSeq是线性的,这种数据结构一般通过遍历来查找
可变集合类图
总结
1)可变集合比不可变集合更加丰富
2)Seq集合中增加了Buffer集合
3)如果涉及到线程安全可以使用 syn开头的集合
定长数组
这里的数组等同于java中的数组,中括号中的类型就是数组元素的类型
def test(): Unit ={
//
var ar = new Array(20);//不使用泛型 的话 元素必须是 nothing相当于集合没啥用
//1)创建int数组 长度为10,在没有赋值情况下各个元素都为0,如果想让数组可以存放任意类型元素将泛型设置为Any
var arr = new Array[Int](10)
arr(1)=10;
println(arr.length)//10
println(arr(0))
for(i <-arr){
println(i)
}
//第二中创建方式
var arr2 = Array(1,2,"sdf")
arr2(1)="hah"
//采用下标遍历
for(index <- 0 until arr2.length){
println(arr2(index))
}
}
变长数组
1)ArrayBuffer 是变长数组,类似java的ArrayList
2)每append一次arr在底层就会重新分配空间,进行扩容,arr的内存地址会繁盛变化(是一个新的对象)
操作示例:
def test(): Unit ={
import collection.mutable.ArrayBuffer
var arr01= ArrayBuffer[Any](3,2,4)
//访问查询
println(arr01(1))
//遍历
for(i<-arr01){
println(i)
}
//修改插入值
//使用 append 追加数据,append支持可变参数 添加元素后 arr01 的hashcode 发生变化 数组进行了扩容
println("hash="+arr01.hashCode())
arr01.append(10,23)
println("hash="+arr01.hashCode())
println("=============")
arr01(1)=99
for(i<-arr01){
println(i)
}
println("=============")
//删除元素 根据下标来删除
arr01.remove(0)
println("数组长度:"+arr01.length)
for(i<-arr01){
println(i)
}
}
定长数组与变长数组转换
在开发中,我们肯恩更实用对定长数组和变长数据进行转换
arr1.toBuffer 定长数组转变长数组 返回结果才是一个变长数组,原数组不会发生改变
arr2.toArray 变长数组转定长数组 返回结果才是一个变长数组,原数组不会发生改变
示例代码
def test(): Unit ={
import collection.mutable.ArrayBuffer
var arr1=ArrayBuffer[Int]()
arr1.append(12,13,14)
println(arr1)
var arr2 = arr1.toArray //该方法根据ArrayBuffer 生成一个新的 Array arr2 原数组 arr1 不发生变化
println(arr2)
// arr2 的 toBuffer 方法 生成一个新的 变长数组 并将元素都添加进去,原数组arr2不发生任何改变
var arr3 = arr2.toBuffer
arr3.append(4)
println(arr3)
}
多维数组定义和使用
示例代码
def test(): Unit ={
//定义一个二维数组 里边包含三个一维数组,一维数组的长度都是4
var arr= Array.ofDim[Int](3,4)
//遍历
for(item<-arr){
for(item2<-item){
println(item2)
}
}
//设置值
arr(1)(1)=100
//取出 指定位置的值
println(arr(1)(1))
//下标方式遍历
for(i<- 0 to arr.length-1){
for(item<- 0 to arr(i).length-1){
println("坐标【"+i+"】【"+item+"】的取值:"+arr(i)(item))
}
}
}
scala数组和javaList的转换
def test(): Unit ={
//数组转 javaList
import collection.mutable.ArrayBuffer
var arr = ArrayBuffer("1","3","3")
import collection.JavaConversions.bufferAsJavaList
val javaArr = new ProcessBuilder(arr)
//arrList 就是java中的List
var arrList = javaArr.command()
arrList.add("java")
println(arrList)
//javaList转 scala数组
import collection.JavaConversions.asScalaBuffer
import collection.mutable
val scalaArr:mutable.Buffer[String] = arrList
scalaArr.append("scala")
println(scalaArr)
}
元组Tuple
元组可以理解为一个容器,可以存放各种相同或不同类型的数据
简单理解 元组将多个无关的数据封装为一个整体,特点是 灵活对数据没有太多约束
元组总最多只能有22个元素
元组定义
代码示例:
//为了高效操作元组,编译器根据元素个数的不同,将元组分为不同的元组类型,
//从 Tuple1(包含一个元素的元组)、 Tuple2 一直到 Tuple22(包含22个元素的元组)
//如下定义了一个元组 tuple1 包含五个元素, 因此tuple1类型是 Tuple5
var tuple1 = (1,2,3,4,“5”)
元组数据的访问及遍历
访问元组的数据,可以采用顺序号(_顺序号) ,也可以通过索引
组的遍历需要使用迭代器
示例
def test(): Unit ={
var tuple1 = (1,2,3,4,"5")
println(tuple1._1)// 访问元组 tuple1 的第一个元素,序号从1 开始
println(tuple1.productElement(0))//访问元组的第一个元素 从 0 开始
//元组的遍历 元组的遍历需要使用迭代器
for(item <-tuple1.productIterator){
println("item:"+item);
}
}