集合

效能特性

語言

前述說明已清楚說明,不同的集合類型具有不同的效能特性。這通常是選擇一種集合類型而非另一種的主要原因。您可以在下表中看到集合上一些常見操作的效能特性摘要。

序列類型的效能特性

  頭部 尾部 套用 更新 前置 後置 插入
不可變              
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)。
前置 在序列的前面新增一個元素。對於不可變序列,這會產生一個新序列。對於可變序列,這會修改現有的序列。
後置 在序列的後面新增一個元素。對於不可變序列,這會產生一個新序列。對於可變序列,這會修改現有的序列。
插入 在序列中的任意位置插入一個元素。這僅對可變序列提供直接支援。

第二個表格處理可變和不可變集合和映射,並執行下列操作

   
查詢 測試元素是否包含在集合中,或選取與金鑰關聯的值。
新增 在集合中新增一個新元素,或在映射中新增一個金鑰/值對。
移除 從集合中移除一個元素,或從映射中移除一個金鑰。
最小值 集合中最小的元素,或映射中最小的金鑰。

此頁面的貢獻者