Arrays
Array
固定长度;ArrayBuffer
可变长度
arr.toBuffer
, buf.toArray
- 初始化是不要使用
new
- 使用
()
访问元素
- 使用
for (elem <- arr)
遍历元素;倒序 arr.reverse
- 使用
for (elem <- arr if ...) ... yield ...
转换为新的数组
- 等价于
arr.filter(...).map(...)
或者更简洁 arr filter { ... } map {...}
- 与 Java 的数组通用,如果是
ArrayBuffer
, 可配合 scala.collection.JavaConversions
使用
- 在做任何操作前都会转换为
ArrayOps
对象
- 构建多维数组
val matrix = Array.ofDim[Double](3, 4)
// 3 行 4 列
Maps & Tuples
- 创建、查询、遍历 Map 的语法便捷
val scores = Map("a" -> 100, "b" -> 90, "c" -> 95)
创建的默认为 immutable
的 hash map
- 可变的 Map 需要显式指定
scala.collection.mutable.Map
- 创建空的 Map 需指定类型
new scala.collection.mutable.HashMap[String, Int]
- Map 是键值对的集合,键值对类型可不相同
"a" -> 100
等价于 ("a", 100)
;创建的另一种写法 Map(("a", 100), ("b", 90), ("c", 95))
- 访问
scores("a")
//返回 Option
scores("d").getOrElse(0)
// 返回实际值
- mutable 更新
- 更新值
scores("a") = 80
- 增加元素
scores += ("d" -> 70, "e" -> 50)
- 删除元素
scores -= "a"
- immutable 不可更新,修改时会产生新的 Map, 但公共部分的元素数据是共享的
- 添加元素会产生新的 Map,
scores + ("d" -> 70, "e" -> 50)
- 删除元素产生新的 Map
scores - "a"
- 遍历
for((k,v) <- map) ...
- 排序 Map
- 按照 key 排序存放
scala.collection.immutable.SortedMap("d" -> 1, "b" -> 2, "c" -> 3)
// Map(b -> 2, c -> 3, d -> 1)
- 按照插入顺序排放
scala.collection.mutable.LinkedHashMap("d" -> 1, "b" -> 2, "c" -> 3)
// Map(d -> 1, b -> 2, c -> 3)
- 区分 mutable 和 immutable
- 默认 hash map,也可使用 tree map
- 与 Java 中的 Map 转换方便
scala.collection.JavaConverters
- 在很多时候需要使用 Java 的接口完成任务,但是处理结果时可转换为 Scala 的数据接口来处理更方便,如文件操作等
- Tuples 在聚合操作时很有用
- Map 中的键值对就是最简单的元组形式
(k, v)
- 类型不必一致
val a = (1, 3.14, "hello")
- 下标访问
a._1
// 1
- 模式匹配访问
val (first, second, _) = a
- 用于返回多个值
- Zipping
Collections

- 集合性能对比
- 多少集合通过
scala.collection.JavaConverters
可与 Java 集合互相转换
- 集合区分 generic(
scala.collection
)、mutable(scala.collection.mutable
) 和 immutable(scala.collection.immutable
)
- 如果未明确导入包或使用包路径,默认使用 immutable
- 集合
trait
或 class
的伴生对象中,都有 apply
方法,可直接构造集合实例,如 Array(1,2,3)
Traversable
集合层级的顶部,只有 foreach
方法是抽象的,其他方法都可直接继承使用
Iterable
,只有 iterator
方法是抽象的,其他方法都可直接继承使用
- 与
Traversable
的区别在于,iterator
带状态(可选择获取下一个元素的时间,在获取下一个元素之前会一直跟踪集合中的位置)
Iterable
中的 foreach
通过 iterator
实现
Seq
有序序列,包含 length
,有固定下标
IndexedSeq
快速随机访问,通过 Vector
实现
LinearSeq
高效的 head
/ tail
操作,通过 ListBuffer
实现
Set
无序集合、无重复元素
- 默认实现为
HashSet
,即元素其实是按照对应的哈希值排序的
- 在
HashSet
中查找元素远快于在 Array
或 List
中查找
Map
键值对集合,scala.Predef
提供了隐式转换,可直接使用 key -> value
表示 (key, value)
Immutable

Mutable

ArrayBuffer
- 包含一个
array
和 size
(继承自 ResizableArray
)
- 多数操作速度与
Array
相同
- 可向尾部添加元素 (恒定分摊时间,对于更大的集合也可以高效的添加元素)
ListBuffer
,类似于 ArrayBuffer
但是基于链表实现
LinkedList
- 元素包含指向下一元素的链接
- 空链表元素自己指向自己
LinkedHashSet
除了 Hash 的特点外,会记录元素插入的顺序
mutable.Queue
+=
添加单个元素;++=
添加多个元素
dequeue
移除并返回队首元素
mutable.Stack
与不可变版本相同,除了会对原数据发生修改
mutable.BitSet
直接修改原数据,更新操作比 immutable.BitSet
更高效
原文链接:http://www.cnblogs.com/yuanzam/p/11605561.html