2011-11-27 55 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赋值。不变的集合使集合本身不可改变,而不是对它的引用。每次修改不可变集合时,都会生成另一个集合,而不是原地修改原始集合。大多数集合都具有不可变和可变的版本,但当然也有例外。