可变集合上的Scala不可变操作

时间:2013-08-27 15:34:57

标签: scala immutability scala-collections mutable

AFAIK应用于不可变集合的Scala集合操作返回一个新集合,由于结构共享,该集合共享前者的大部分结构。

我的问题是:考虑到这些操作也可以应用于返回新结构的可变数据结构,是不可变集合的结构共享吗?

2 个答案:

答案 0 :(得分:3)

不,只有当共享的部分保证永不改变时,才能进行结构共享。以不可变列表为例:prepend返回一个列表,除了第一个元素与原始元素之外的所有内容之外,原因是原始的一个永远不会改变。如果没有这种保证,则prepend方法必须复制整个列表,以便对原始列表的更改不会影响新列表。对于可变集合,不提供此保证(因为原始集合实际上可以更改),因此可变集合不能使用结构共享。

答案 1 :(得分:1)

不,因为这样的共享会违反两者中的任何一个:返回具有修改内容的新对象,而不是在修改新对象时修改原始集合。共享结构仅适用于不可变集合,因为不变性消除了在另一个对象发生变化时更改一个对象的风险。

当然,在内容层面上有共享,例如在mutable.List[String]中,新列表使用与原始实例相同的String个实例的引用,但这就是它结束的位置。