2011-11-27 53 views
30

我是相當新的斯卡拉,並試圖瞭解收集層次結構。我發現「可變」和「不可變」集合之間存在區別,但我不明白這在實現級別實際上意味着什麼,以及這與valvar的關係如何。任何人都可以給我一些見解嗎?另外,每個集合類都有一個'可變'版本和'不可變'版本,還是有一些只能是'可變'或'不可變'的類?可變與不可變在斯卡拉集合

回答

50

可變意味着您可以在原地更改集合。因此,如果您有一個集合c並且您附加了一個元素+=,那麼c已更改,並且對該集合的所有其他引用都有更改。

不可變意味着集合對象永遠不會改變;而是使用+++等操作構建新的集合對象,其中返回新集合。這在併發算法中很有用,因爲它不需要鎖定就可以將某些東西添加到集合中。它可能會花費一些開銷,但是這個屬性可能非常有用。斯卡拉的不變的集合是fully persistent data structures

的區別是非常相似varval之間,但你要知道:

  1. 您可以修改綁定到就地一val可變集合,雖然你不能重新分配val
  2. 您無法在原地修改不可變的集合,但是如果將其分配給var,則可以通過諸如+的操作將該var重新指定爲由其構建的集合。

並非所有集合都必須存在於可變和不可變變體中;最後一次檢查時,只支持可變優先級隊列。

+0

謝謝,這很有道理! – astay13

+4

優秀的可變vs不可變的總結。工作很好。 – Clive

+0

在'var a = 0'中,如果兩個線程同時嘗試同時執行'a = 1'和'a = 2',它是如何處理的?它不需要鎖定嗎? – Jus12

6

不可變意味着不可改變。 val使引用不可更改,這意味着一旦初始化後就不能爲val賦值。不變的集合使集合本身不可改變,而不是對它的引用。每次修改不可變集合時,都會生成另一個集合,而不是原地修改原始集合。大多數集合都具有不可變和可變的版本,但當然也有例外。