我们知道Scala支持不可变数据结构。每次更新列表时,它都会在堆中创建一个新对象和引用。
实施例
val xs:List[Int] = List.apply(22)
val newList = xs ++ (33)
因此,当我将第二个元素附加到列表时,它将创建一个包含22和33的新列表。这完全类似于不可变的String在Java中的工作方式。 所以问题是每次我在列表中追加一个元素时,每次都会创建一个新对象。这对我来说效率不高。 是否有一些特殊的数据结构,比如持久性数据结构,在处理这个问题时会使用。有人知道吗?
答案 0 :(得分:1)
附加到列表具有O(n)复杂性并且效率低下。一般方法是在构建列表时将其添加到列表中,最后将其反转。
现在,关于创建新对象的问题仍然适用于前置。请注意,由于xs
是不可变的,newList
只是在前置后指向其余数据的xs。
答案 1 :(得分:1)
虽然@manojlds在他的分析中是正确的,但是原始帖子询问了每当你进行操作时复制列表节点的效率。
正如@manojlds所说,构建列表通常需要向后思考,即构建列表然后将其反转。在许多其他情况下,列表构建需要"不必要的"复制。
为此,Scala中有一个可变数据结构,称为ListBuffer
,您可以使用它来构建列表,然后将结果提取为不可变列表:
val xsa = ListBuffer[Int](22)
xsa += 33
val newList = xsa.toList
但是,列表数据结构通常是不可变的这一事实意味着您有一些非常有用的工具来分析,分解和重新组合列表。许多内置操作利用了不变性。通过扩展,您自己的程序也可以利用这种不变性。