Scala学习笔记8 - 集合

===集合

      scala的集合(collection库分为可变(mutable类型与不可变(immutable类型。以Set为例,特质scala.collection.immutable.Set和scala.collection.mutable.Set都扩展自scala.collection.Set。

 

scala集合的顶层抽象类和特质

 

scala.collection.immutable

 

scala.collection.mutable

 

不可变集合与可变集合之间的对应关系

不可变(collection.immutable._

可变(collection.mutable._

Array

ArrayBuffer

List

ListBuffer

String

StringBuilder

-

LinkedList, DoubleLinkedList

List

MutableList

Queue

Queue

Array

ArraySeq

Stack

Stack

HashMap HashSet

HashMap HashSet

-

ArrayStack

 

IterableIterator

      Iterable是可变和不可变序列、集、映射的超特质。集合对象可以通过调用iterator方法来产生迭代器IteratorIterableIterator之间的差异在于:前者指代的是可以被枚举的类型,而后者是用来执行枚举操作的机制。尽管Iterable可以被枚举若干次,但Iterator仅能使用一次。

 

数组

      在scala中,数组保存相同类型的元素,其中包含的元素值是可变的。数组也是对象,访问数组使用小括号。在JVM中,scala的数组以java数组方式实现。scala中数组是非协变的。

      定长数组使用Array,创建之后长度不可改变。变长数组使用ArrayBuffer

      与java一样,scala中多维数组也是通过数组的数组来实现的。构造多维数组可以使用ofDim方法或者直接使for循环来new。示例如下:

                   val matrix = Array.ofDim[Double](3,4)           // ofDim方法创建多维数组

                   matrix(1)(2) = 12.36

                   val mutliarr = newArray[Array[Int]](10)          // for循环方式创建多维数组

                   for(i <- 0 untilmutliarr.length)

                            mutliarr(i) = newArray[Int](5)

 

列表

      列表保存相同类型的元素。scala里的列表类型是协变的,这意味着如果S是T的子类,那么List[S]也是List[T]的子类。

      不可变列表使用List,一旦创建之后就不可改变。可变列表使用ListBuffer

      List是抽象类,它有两个子类型:Nil和::。Nil是空列表对象,类型是List[Nothing]。::是样本类,可以创建非空列表,::的伴生对象可以以中缀标注的形式用于模式匹配。所以在scala中存在两个::,一个是样本类,另一个是List的方法,因此在构造一个列表时,我们就有了多种方法,如下:

                   val list1 = List("A")      // 这里List是伴生对象,相当于 List.apply()

                   val list2 =::("A",Nil)     // 这里::是伴生对象, 相当于 ::.apply()

                   val list3 = "A" ::Nil      // 这里::是方法, 相当于 Nil.::()

      List类没有提供append操作(向列表尾部追加),因为随着列表变长,效率将逐渐低下。List提供了“::”做前缀插入,因为这将消耗固定时间。如果你想通过添加元素来构造列表,你的选择是先把它们前缀插入,完成之后再调用reverse;或者使用ListBuffer,一种提供append操作的可变列表,完成之后调用toList。

 

队列

      scala集合库提供了可变和不可变的栈类Stack,也提供了可变和不可变的队列类Queue

 

元组对偶

      元组Tuple也是不可变的,但元组可以包含不同类型的元素,并且因此而不能继承自Iterable。

      元组实例化之后,可以使用点号、下划线和从1开始的索引访问其中的元素。因为元组可以保存不同类型的元素,所以不能使用apply方法访问其元素(apply返回同样的类型)。元组的索引从1开始,是因为对于拥有静态类型元组的其他语言,如Haskell和ML,从1开始是传统的设定。

      scala的任何对象都可以调用“->”方法,并返回包含键值对的二元组(也叫对偶,是元组的最简单形态),比如 “hello” -> 100 则创建出 (“hello”,100)。

      元组相应操作示例如下:

                   val t = (1400, “Jim”, “haha”, 3.14)                    //定义一个元组

                   val second = t._2                                                // 引用元组第二个组元

                   val (first, second, third,fourth) = t                    // 分别获取元组的第1、2、3、4个组元

                   val (first, secong, _) = t                                     // 只获取前两个组元

 

映射

      中保存着不重复的元素。映射可以把键和值关联起来保存。

 

拉链操作

                   val symbols = Array(“<”, “-”, “>”)

                   val counts = Array(2, 10, 2)

                   val pairs = symbols.zip(counts)

以上代码生成对偶类型的数组,如下:

                   Array((<,2), (-,10), (>,2))

 

可变集合vs不可变集合

      可变集合性能更好,不可变集合更易于理清头绪。对于某些问题来说,可变集合能够很好的处理;而另一些,不可变集合更为合适。如果在使用可变集合时,你发现需要担忧何时复制可变集合的副本,或者思考很多关于谁“主宰”或“拥有”可变集合的时候,那么请考虑是否可用不可变集合代替。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值