第十章 Scala基础——集合

不管是用Scala编写软件,还是用Chisel开发硬件电路,集合都是非常有用的数据结构。Scala里常见的集合有:数组、列表、集、映射、序列、元组、数组缓冲和列表缓冲。了解这些集合的概念并熟练掌握基本使用方法,对提高工作效率大有帮助。本章的内容便是逐一讲解这些集合类,所涉内容均为基础,对编写、阅读Chisel代码有用即可。如果想深入了解集合的原理,请读者自行学习。

一、数组

数组是最基本的集合,实际是计算机内一片地址连续的内存空间,通过指针来访问每一个数组元素。因为数组是结构最简单的集合,所以它在访问速度上要比其它集合要更快。Scala的数组类名为Array,继承自Java。Array是一个具体的类,因此可以通过new来构造一个数组对象。数组元素的类型可以是任意的,而且不同的元素类型会导致每个元素的内存大小不一样,但是所有元素的类型必须一致。Scala编译器的泛型机制是擦除式的,在运行时并不会保留类型参数的信息。但是数组的特点使得它成为唯一的例外,因为数组的元素类型跟数组保存在一起。

数组对象必须是定长的,也就是在构造时可以选择任意长度的数组,构造完毕后就不能再更改长度了。构造数组对象的语法如下:

new Array[T](n)

其中,方括号里的T表示元素的类型,它可以显式声明,也可以通过传入给构造方法的对象来自动推断。圆括号里的n代表元素个数,它必须是一个非负整数,如果n等于0则表示空数组。和Java一样,Scala的类型参数也是放在方括号里的。构造对象时,除了可以用值参数来“配置”对象,也可以用类型参数来“配置”。这其实是oop里一种重要的多态,称为全类型多态或参数多态,即通过已有的各种类型创建新的各种类型。

数组可以用过下标来索引每个元素,和大多数语言一样,Scala的数组下标也是从0开始的。不过,有一点不同的是,其他语言的数组下标都是写在方括号里,而Scala的数组下标却是写在圆括号里。还记得“操作符即方法吗”?Scala并没有什么下标索引操作符,而是在Array类里定义了一个apply方法,该方法接收一个Int类型的参数,返回对应下标的数组元素。所以,Scala的数组下标才要写在圆括号里,这其实是让编译器隐式插入apply方法的调用,当然读者也可以显式调用。

虽然数组是定长的,但是每个数组元素都是可变的,也就是可以对数组元素重新赋值。例如:

scala> val intArray = new Array[Int](3)
intArray: Array[Int] = Array(0, 0, 0)

scala> intArray(0) = 1

scala> intArray(1) = 2

scala> intArray(2) = 3

scala> intArray
res0: Array[Int] = Array(1, 2, 3)

除此之外,Array的伴生对象里还定义了一个apply工厂方法,因此也可以按如下方式构造数组对象:

scala> val charArray = Array('a', 'b', 'c')
charArray: Array[Char] = Array(a, b, c) 

二、列表

 列表是一种基于链表的数据结构,这使得列表访问头部元素很快,往头部增加新元素也是消耗定长时间,但是对尾部进行操作则需要线性化的时间,也就是列表越大时间越长。列表类名为List,这是一个抽象类,因此不能用new来构造列表对象。但是伴生对象里有一个apply工厂方法,接收若干个参数,以数组的形式转换成列表(链表)。列表也是定长的,且每个元素的类型相同、不可再重新赋值,有点像不可写入的数组。列表元素也是从下标0开始索引,下标同样写在圆括号里。例如:

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值