集合 (Scala 2.8 - 2.12)

效能特性

語言

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

序列類型的效能特性

  head tail apply update prepend append insert
immutable              
List C C L L C L -
Stream C C L L C L -
Vector eC eC eC eC eC eC -
Stack C C L L C L L
Queue aC aC L L C C -
Range C C C - - - -
String C L C L L L -
mutable              
ArrayBuffer C L C C L aC L
ListBuffer C L L L C C L
StringBuilder C L C C L aC L
MutableList C L L L C C L
Queue C L L L C C L
ArraySeq C L C C - - -
Stack C L L L C L L
ArrayStack C L C C aC L L
Array C L C C - - -

集合和映射類型的效能特性

  lookup add remove min
immutable        
HashSet/HashMap eC eC eC L
TreeSet/TreeMap Log Log Log Log
BitSet C L L eC1
ListMap L L L L
mutable        
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 操作為線性,也就是說操作時間與集合大小成正比。
- 不支援此操作。

第一個表格處理序列類型,包括不可變和可變類型,以及下列操作

   
head 選取序列的第一個元素。
tail 產生一個新的序列,包含所有元素,但第一個元素除外。
apply 索引。
update 函式更新(使用 updated)適用於不可變序列,副作用更新(使用 update)適用於可變序列。
prepend 在序列前面新增一個元素。對於不可變序列,這會產生一個新的序列。對於可變序列,這會修改現有的序列。
append 在序列後面新增一個元素。對於不可變序列,這會產生一個新的序列。對於可變序列,這會修改現有的序列。
insert 在序列中的任意位置插入一個元素。這僅直接支援可變序列。

第二個表格處理可變和不可變集合和對應,以及下列操作

   
lookup 測試集合中是否包含一個元素,或選取與金鑰關聯的值。
add 在集合中新增一個新元素,或在對應中新增一個金鑰/值對。
remove 從集合中移除一個元素,或從對應中移除一個金鑰。
min 集合中最小的元素,或對應中最小的金鑰。

此頁面的貢獻者