scala的集合类型

一、集合类型

集合是⼀种用来存储各种对象和数据的容器。Scala 集合分为可变的和不可变的集合。

1. 不可变集合可以安全的并发访问。

2. 可变集合可以在适当的地⽅被更新或扩展。这意味着你可以修改,添加,移除⼀个集合的元素。

Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质,意味着 集合的基本特点是⽀持迭代遍历的。

scala集合两个主要的包:

# 不可变集合
 scala.collection.immutable (Scala默认采用不可变集合)
# 可变集合
 scala.collection.mutable

分类 描述
Seq 序列。元素以线性方式存储,集合中可以存放重复对象。
Set 集(数据集,区别于集合)。集中的对象不按特定的方式排序,并且没有重复对象。
Map ⼀种把键对象和值对象映射的集合,它的每⼀个元素都包含⼀对键对象和值对象。

对于可变与不可变集合,Seq、Set、Map又有不同的实现方式,下面两张图详细描述了其继承关系。

 

1.数组

任何数组都是可变集合

数组包括:Array(定长)和ArrayBuffer(变长)

# Array
- 定长数组,数组不可扩容 scala.Array
# ArrayBuffer
- 变长数组,数组可扩容 scala.collection.mutable.ArrayBuffer

val arr=Array(1,2,3)

val arr1=new Array(100)

scala> arr :+ 4  //+:
res306: Array[Int] = Array(1, 2, 3, 4)
arr是定长数组,不能修改长度,这里是返回新的数组,原数组并没有被修改

# 什么时候用new

如果没有提供object的apply方法时,class必须用new.

定长数组

arr是定长数组,不能改变长度 

定⻓数组是不可变集合吗? 不是。定长数组是可变集合的⼀种,内容可变,但是其长度不可变。

 # 扩展:为什么定长数组是可变集合?
 Array本身不属于scala集合成员,从前⾯类继承图中也可发现这⼀点,在可变集合图中IndexedSeq有⼀条虚线指向了Array,说明并不是直接继承关系。
 ⼀般将Array归为集合是因为Scala默认将Array隐式转换为WrappedArray,⽽WrappedArray实现了IndexedSeq特质。
 从这⼀点上来说,String与WrappedString也有异曲同⼯之妙,可以发现在不可变集合中,String与IndexedSeq也是虚线连接,也就是说在Scala中,String可以当集合处理。参考下⽂中的描述,请⾃⾏通过源码验证。

Array被隐式转换为WrappedArray(scala.collection.mutable.WrappedArray),间接拥有了集合的特征。

//Predef.scala 提示:所有scala⽂件默认导⼊Predef对象
implicit def genericWrapArray[T](xs: Array[T]): WrappedArray[T] =
 if (xs eq null) null
 else WrappedArray.make(xs)

 

变长数组 ArrayBuffer

# ArrayBuffer的创建

1)直接创建

2)由Array转化

# 由arr转化 arr.toBuffer
scala> arr.toBuffer
res286: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3)

scala> arr.toBuffer+=4
res287: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3, 4)

scala> res286
res289: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3)
scala> res287
res290: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3, 4)


# 直接创建
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

scala> val arrBuff=ArrayBuffer(1, 2, 3)
arrBuff: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)

小结:ArrayBuffer是在原来的Buffer上修改.

+: 返回新的对象

+=  是在原对象上修改

Array(1,2,3,4,5).filter(_%2==0).map(_*2).foreach(println)

2 元组

Scala Tuple表示固定元素的组合,元组可以装着多个不同类型的值,是不同类型的值的聚集。Tuple是Scala中⾮常 重要的⼀种数据结构,后⾯会大量使用。其特点包括:

  1. 最多⽀持22个元素组合,分别对应类型Tuple1~Tuple22,相应也称为⼀元组(⼀般不用)、⼆元组、三元组...
  2. 元组可以容纳不同类型的元素
  3. 元组不可变

创建元组:使用小括号 () 将多个元素括起来,元素之间⽤逗号分隔,元素的类型和个数不超过22。

访问组元:使用 _1 , _2 , _3 等形式访问组元,注意下标从1开始

scala> val stu=(101,"oak","male",24)
s
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Oak-Komorebi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值