如何复制整个列表并附加元素比仅追加它更有效?

时间:2012-06-20 20:13:36

标签: performance append immutability

附加到不可变列表的某些claim更有效。这是真的?怎么样?

2 个答案:

答案 0 :(得分:0)

可以在线程之间共享不可变对象而不进行同步。同步会对缩放产生负面影响,并且可能比复制更昂贵。

答案 1 :(得分:0)

通过分配足够大的数组以保存修改后的版本并复制所有未修改的元素来生成列表的修改版本有点昂贵,无论修改是附加,插入,删除,替换,或其他任何东西。成本与生成未修改但不同的列表副本的成本大致相当。

如果某个对象Foo希望维护一个元素列表,使其只能在Foo更改它时进行更改,则可以使用两种常用方法:< / p>

  1. 它可以使用“不可变列表”类型,它保证任何曾经暴露给外部世界的实例将永远保持相同的对象序列。对象`Foo`可以自由地公开对这个列表的引用,因为没有人能够改变它。如果`Foo`想要例如将一个项添加到其列表中,它将生成一个新的不可变列表,其中包含列表中的所有项目以及新项目,并开始持有对该项目的引用而不是旧项目。
  2. 它可以创建一个可变的列表对象,但永远不会暴露给外界。如果有人需要从列表中检索项目序列,`Foo`会将列表的内容复制到一个新列表中,调用者可以以任何方式使用它,而不会影响`Foo的列表。

如果使用方法#1,那么每次Foo改变列表时它必须创建一个新的“不可变列表”实例,但是Foo可以回答对列表内容的请求而无需复制它。如果使用方法#2,则向列表中添加项目(以及其他修改)将更便宜,但是回答对列表内容的请求将需要复制列表。是否更好地使用方法#1或方法#2将取决于列表更新的频率,以及应用程序需要副本的频率。