【发布时间】:2014-11-19 23:25:22
【问题描述】:
我们知道 Scala 支持不可变数据结构。即每次更新列表时,它都会在堆中创建一个新对象和引用。
例子
val xs:List[Int] = List.apply(22)
val newList = xs ++ (33)
因此,当我将第二个元素附加到列表时,它将创建一个包含 22 和 33 的新列表。这与 Java 中不可变字符串的工作方式完全相同。 所以问题是每次我在列表中添加一个元素时,每次都会创建一个新对象。这对我来说看起来效率不高。 处理这个时是否使用了一些特殊的数据结构,如持久数据结构。有人知道吗?
【问题讨论】:
-
有充分的理由支持不变性。这些原因的一个很好的总结可以在 Effective Java,第 15 条中找到。作为性能问题的解决方案,它建议您要么依赖可变数据结构的有效内部实现,要么使用一个可变的对应物(例如,
ListBuffer)。 -
列表仅在前置时有效。如果要追加,请使用 IndexedSeq,它使用 Vector 数据结构。这对于追加和前置都是相当有效的,而且是不可变的。
标签: scala functional-programming