前述說明已清楚說明,不同的集合類型具有不同的效能特性。這通常是選擇一種集合類型而非另一種的主要原因。您可以在下表中看到集合上一些常見操作的效能特性摘要。
序列類型的效能特性
頭部 | 尾部 | 套用 | 更新 | 前置 | 後置 | 插入 | |
---|---|---|---|---|---|---|---|
不可變 | |||||||
List |
C | C | L | L | C | L | - |
LazyList |
C | C | L | L | C | L | - |
ArraySeq |
C | L | C | L | L | L | - |
Vector |
eC | eC | eC | eC | eC | eC | - |
Queue |
aC | aC | L | L | L | C | - |
Range |
C | C | C | - | - | - | - |
String |
C | L | C | L | L | L | - |
可變 | |||||||
ArrayBuffer |
C | L | C | C | L | aC | L |
ListBuffer |
C | L | L | L | C | C | L |
StringBuilder |
C | L | C | C | L | aC | L |
Queue |
C | L | L | L | C | C | L |
ArraySeq |
C | L | C | C | - | - | - |
Stack |
C | L | L | L | C | L | L |
Array |
C | L | C | C | - | - | - |
ArrayDeque |
C | L | C | C | aC | aC | L |
集合和映射類型的效能特性
查詢 | 新增 | 移除 | 最小值 | |
---|---|---|---|---|
不可變 | ||||
HashSet /HashMap |
eC | eC | eC | L |
TreeSet /TreeMap |
Log | Log | Log | Log |
BitSet |
C | L | L | eC1 |
VectorMap |
eC | eC | aC | L |
ListMap |
L | L | L | L |
可變 | ||||
HashSet /HashMap |
eC | eC | eC | L |
WeakHashMap |
eC | eC | eC | L |
BitSet |
C | aC | C | eC1 |
TreeSet |
Log | Log | Log | Log |
腳註:1 假設位元密集封裝。
這兩個表格中的項目說明如下
C | 操作需要(快速)常數時間。 |
eC | 操作需要有效常數時間,但這可能取決於某些假設,例如向量的最大長度或雜湊金鑰的分配。 |
aC | 操作需要攤銷常數時間。某些操作呼叫可能需要較長的時間,但如果執行許多操作,平均而言每個操作只需要常數時間。 |
Log | 操作需要與集合大小對數成正比的時間。 |
L | 操作是線性的,也就是說需要與集合大小成正比的時間。 |
- | 操作不受支援。 |
第一個表格處理序列類型(不可變和可變)以及下列操作
頭部 | 選取序列的第一個元素。 |
尾部 | 產生一個新的序列,包含除了第一個元素之外的所有元素。 |
套用 | 索引。 |
更新 | 不可變序列的函數更新(使用 updated ),可變序列的副作用更新(使用 update )。 |
前置 | 在序列的前面新增一個元素。對於不可變序列,這會產生一個新序列。對於可變序列,這會修改現有的序列。 |
後置 | 在序列的後面新增一個元素。對於不可變序列,這會產生一個新序列。對於可變序列,這會修改現有的序列。 |
插入 | 在序列中的任意位置插入一個元素。這僅對可變序列提供直接支援。 |
第二個表格處理可變和不可變集合和映射,並執行下列操作
查詢 | 測試元素是否包含在集合中,或選取與金鑰關聯的值。 |
新增 | 在集合中新增一個新元素,或在映射中新增一個金鑰/值對。 |
移除 | 從集合中移除一個元素,或從映射中移除一個金鑰。 |
最小值 | 集合中最小的元素,或映射中最小的金鑰。 |