我是Scala的新手,我正在尝试理解集合层次结构。我看到“可变”和“不可变”集合之间存在区别,但我不明白这在实现级别实际意味着什么以及它与val
和var
的关系。有人能给我一些见解吗?此外,每个集合类都有“可变”版本和“不可变”版本,还是有些类只能是“可变”或“不可变”?
答案 0 :(得分:60)
Mutable意味着您可以就地更改集合。因此,如果您有一个集合c
并且附加了+=
的元素,那么c
已经更改,因此对该集合的所有其他引用也是如此。
不可变意味着集合对象永远不会改变;相反,您使用+
或++
等操作构建新的集合对象,返回新集合。这在并发算法中很有用,因为它不需要锁定来向集合添加内容。它可能以一些开销为代价,但这个属性非常有用。 Scala的不可变集合是fully persistent data structures。
差异与var
和val
之间的差异非常相似,但请注意:
val
就地的可变集合,但无法重新分配val
var
,则可以通过{{1}之类的操作将var
重新分配给由其构建的集合。 }}。并非所有集合都必然存在于可变和不可变的变体中;我最后一次检查时,只支持可变优先级队列。
答案 1 :(得分:7)
不可改变意味着不可改变。 val
使引用不可更改,这意味着一旦初始化,您就无法为val
赋值。不可变集合使集合本身不可更改而不是对它的引用。每次修改不可变集合时,都会生成另一个集合,而不是就地修改原始集合。大多数集合都有不可变版本和可变版本,但当然也有例外。