前缀如何保留列表的不变性,而追加不能保留?

问题描述 投票:0回答:1

如果将元素添加到列表中,如何在Scala中保留列表的不变性?不应该列出新的清单吗?在Java中,如果将字母添加为第一个字符,则将生成新的String,并且Java中的字符串是不可变的。在Scala中追加为线性时间的原因是什么?它是遍历整个列表并在末尾添加,还是线性的,因为自更改对象以来我们需要创建一个全新的列表?

scala immutability
1个回答
1
投票

List的前面和后面都会产生一个新的List,因此保留了List的不变性。附加到List是线性时间,因为List被实现为singly链表,因此它不知道对最后一个元素的引用。


发表评论,List使用结构共享”这意味着通常内存开销保持不变。列表是一个非常有效的结构,尽管只要您以前置方式正确使用它,就会返回新的List。有时,您必须在列表末尾reverse才能获得所需的订单,但这是一次性的遍历。最后,应始终在特定情况下通过sbt-jmh来衡量性能。


也请注意不要将ArrayList混淆。前者并不是真正的Scala集合

implicitly[Array[Int] <:< Iterable[Int]] // error

证明Array不是Scala集合基础的子类型。 Array是一个Java数组,只有在绝对确定要使用它时才应使用。

© www.soinside.com 2019 - 2024. All rights reserved.