文章目录

  • ​​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

不可变集合类图

Scala集合-数组、元组_元组

总结
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是线性的,这种数据结构一般通过遍历来查找

可变集合类图

Scala集合-数组、元组_元组_02

总结
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);
}
}