我是相当新的斯卡拉,并试图了解收集层次结构。我发现“可变”和“不可变”集合之间存在区别,但我不明白这在实现级别实际上意味着什么,以及这与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