我是相當新的斯卡拉,並試圖瞭解收集層次結構。我發現「可變」和「不可變」集合之間存在區別,但我不明白這在實現級別實際上意味着什麼,以及這與val
和var
的關係如何。任何人都可以給我一些見解嗎?另外,每個集合類都有一個'可變'版本和'不可變'版本,還是有一些只能是'可變'或'不可變'的類?可變與不可變在斯卡拉集合
30
A
回答
50
可變意味着您可以在原地更改集合。因此,如果您有一個集合c
並且您附加了一個元素+=
,那麼c
已更改,並且對該集合的所有其他引用都有更改。
不可變意味着集合對象永遠不會改變;而是使用+
或++
等操作構建新的集合對象,其中返回新集合。這在併發算法中很有用,因爲它不需要鎖定就可以將某些東西添加到集合中。它可能會花費一些開銷,但是這個屬性可能非常有用。斯卡拉的不變的集合是fully persistent data structures。
的區別是非常相似var
和val
之間,但你要知道:
- 您可以修改綁定到就地一
val
可變集合,雖然你不能重新分配val
- 您無法在原地修改不可變的集合,但是如果將其分配給
var
,則可以通過諸如+
的操作將該var
重新指定爲由其構建的集合。
並非所有集合都必須存在於可變和不可變變體中;最後一次檢查時,只支持可變優先級隊列。
6
不可變意味着不可改變。 val
使引用不可更改,這意味着一旦初始化後就不能爲val
賦值。不變的集合使集合本身不可改變,而不是對它的引用。每次修改不可變集合時,都會生成另一個集合,而不是原地修改原始集合。大多數集合都具有不可變和可變的版本,但當然也有例外。
相關問題
- 1. 斯卡拉變化for循環可變聚集到不可變
- 2. 可變的斯卡拉集合的不可修改的看法
- 3. 斯卡拉 - 可變映射
- 4. 可變參數與斯卡拉
- 5. 不可改變的斯卡拉收藏
- 6. 斯卡拉不可變Multimap之
- 7. 斯卡拉,集合,可變訪問範圍
- 8. 斯卡拉可變集合的迭代器?
- 9. 斯卡拉不可變VS可變。應該怎麼走?
- 10. 斯卡拉:包含可變和不可變套
- 11. 可變變量與可變集合
- 12. 斯卡拉可變參數計數
- 13. 斯卡拉可變地圖添加
- 14. 沒有斯卡拉可變列表
- 15. 斯卡拉與週期不可變鏈接列表
- 16. 如何將可變集合變爲不可變集合
- 17. 斯卡拉 - 可以不申請返回可變參數嗎?
- 18. 轉換不可變爲可變集合
- 19. 斯卡拉 - 初始化可變映射並將它們公開爲不可變
- 20. 微基準比較Scala可變,不可變集合與java.util.concurrent。*集合
- 21. 斯卡拉更新集合
- 22. 調用Java的可變參數從斯卡拉與原語
- 23. 斯卡拉:避免可變實例變量
- 24. 不可變的集合?
- 25. 可變或不可變集?
- 26. 斯卡拉:在不變的方式
- 27. 斯卡拉斯卡拉 - 但類RDD是不變的類型T
- 28. 斯卡拉集合包含不使用==?
- 29. 斯卡拉「對象」變量不可見從Java?
- 30. 斯卡拉「更新」不可變對象的最佳實踐
謝謝,這很有道理! – astay13
優秀的可變vs不可變的總結。工作很好。 – Clive
在'var a = 0'中,如果兩個線程同時嘗試同時執行'a = 1'和'a = 2',它是如何處理的?它不需要鎖定嗎? – Jus12