Scala学习系列-集合1:集合概述
(未完)
概述
collection | collection.immutable | collection.mutable | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
TraversableOnce | |||||||||||||||
Iterator | |||||||||||||||
BufferedIterator | |||||||||||||||
Traversable | Traversable | Traversable | |||||||||||||
Iterable | Iterable | Iterable | |||||||||||||
Seq | Seq | Seq | |||||||||||||
LinearSeq | LinearSeq | LinearSeq | |||||||||||||
<C>List | <C>MutableList | ||||||||||||||
<C>Stream | <C>LinkedList | ||||||||||||||
<C>Stack | <C>DoubleLinkedList | ||||||||||||||
<C>Queue | |||||||||||||||
IndexedSeq | IndexedSeq | IndexedSeq | |||||||||||||
<C>Range | ResizableArray | ||||||||||||||
<C>Vector | <C>ArrayBuffer | ||||||||||||||
<C>ArrayStack | |||||||||||||||
<C>ArraySeq | |||||||||||||||
<C>StringBuilder | |||||||||||||||
<C>WrappedArray | |||||||||||||||
Buffer | |||||||||||||||
<C>ArrayBuffer | |||||||||||||||
<C>ListBuffer | |||||||||||||||
<C>Stack | |||||||||||||||
Set | Set | Set | |||||||||||||
SortedSet | SortedSet | SortedSet | |||||||||||||
<C>TreeSet | <C>TreeSet | ||||||||||||||
<C>BitSet | <C>BitSet | ||||||||||||||
<C>ListSet | <C>LinkedHashSet | ||||||||||||||
<C>HashSet | <C>HashSet | ||||||||||||||
<C>WeakHashSet | |||||||||||||||
Map | Map | Map | |||||||||||||
SortedMap | SortedMap | SortedMap | |||||||||||||
<C>TreeMap | <C>TreeMap | ||||||||||||||
<C>HashMap | <C>HashMap | ||||||||||||||
<C>ListMap | <C>ListMap | ||||||||||||||
<C>LinkedHashMap |
以下,我们以Scala集合顶层包路径scala.collection
中的特质来逐步展开介绍Scala中集合的整体框架。
TraversableOnce
集合可以是只遍历一遍的集合(Iterator
),也可以是可遍历多次的集合(Traversable
)。TraversableOnce
是集合的顶级模版特质,它存在的主要作用是消除Iterator
和 Traversable
之间的重复代码。
TraversableOnce
中实现了一些常用的方法,并且很多方法是通过def foreach[U](f: A => U): Unit
来实现的。同时,其内还包含有其它几个抽象方法,由子特质Iterator
和Traversable
负责实现,其中:
- 特质
Iterator
的实例只能被遍历一次; - 特质
Traversable
的实例可以被遍历多次;
Traversable
我们看Traversable
的定义,它直接继承了特质TraversableLike
,TraversableLike
中定义了大量的实现方法用来提供对来自GenTraversable
、TraversableOnce
、GenericTraversableTemplate
这三个特质中未实现的方法的支持。
1 | trait Traversable[+A] extends TraversableLike[A, Traversable[A]] |
TraversableLike
中唯一没有提供实现的方法是:def foreach[U](f: A => U): Unit
,所以Traversable
的子类中必须提供对该方法的实现。
详细API文档,可参考Scala Traversable API。
TraversableLike
TODO
Iterable
我们看特质Iterable
的定义,它继承了特质Traversable
,同时继承了特质IterableLike
;特质IterableLike
中定义的方法全部是通过其内部未实现的方法def iterator: Iterator[A]
进行实现的,同时特质IterableLike
中覆盖了特质IterableLike
中的一些方法,这样对于特质Iterable
而言,它实现了特质Traversable
中方法的Iterator版本(比如,def foreach[U](f: A => U): Unit
),之所以覆盖特质IterableLike
中方法的实现,其中一个主要原因是使用iterator()
方法实现的一些方法比IterableLike
中方法可以提供更好的性能。
对于特质IterableLike
未实现方法def iterator: Iterator[A]
,Traversable
的子类必须提供对该方法的实现。
1 | trait Iterable[+A] extends Traversable[A] |
详细API文档,可参考Scala Iterable API。
IterableLike
1 | trait IterableLike[+A, +Repr] extends Any with Equals with TraversableLike[A, Repr] with GenIterableLike[A, Repr] {} |
TODO
Seq&LinearSeq&IndexedSeq
TODO
Set
TODO
Map
TODO
具体的不可变集合类
List
Stream
Stack
Queue
Range
Vector
哈希字典树
红黑树
BitSet
ListMap
具体的可变集合类
ArrayBuffer
ListBuffer
ListBuffer提供了常量时间的往后追加和往前追加的操作。
StringBuilder
LinkedList
DoubleLinkedList
MutableList
Queue
ArraySeq
Stack
ArrayStack
HashMap
WeakHashMap
ConcurrentHashMap
BitSet
集合之间的转换
集合转换为列表或数组
需要注意,转换成列表或数组通常需要将集合的所有元素做拷贝,因此对于大型集合来说可能会比较耗时。
可变集合与不可变集合之间转换
通常采用的方法是:首先,创建一个空的目标类型的集合,然后使用++或++=进行添加。
1 | val colors = List("blue", "yellow", "red", "green") |
1 | val muta = mutable.Map("i" -> 1, "ii" -> 2) |
Notes
本文基于Scala2.12.13