有人声称附加到不可变列表更有效。这是真的?如何?
问问题
114 次
2 回答
0
不可变对象可以在线程之间共享而无需同步。同步会对扩展产生负面影响,并且可能比复制成本更高。
于 2012-06-20T21:03:33.203 回答
0
通过分配一个足够大的数组来保存修改后的版本并复制所有未修改的元素来生成列表的修改版本有点昂贵,无论修改是追加、插入、删除、替换还是其他任何东西. 成本大致与生成未修改但不同的列表副本的成本相当。
如果一个对象Foo
希望以一种只有在更改它时才能更改它的方式来维护一个元素列表,那么Foo
它可以使用两种常见的方法来做到这一点:
- 它可以使用“不可变列表”类型,以保证任何曾经暴露于外部世界的实例将永远拥有相同的对象序列。对象 Foo 可以自由地公开对这个列表的引用,因为没有人能够改变它。如果 Foo 想要将一个项目添加到它的列表中,它会生成一个新的不可变列表,其中包含列表中的所有项目,加上新的,并开始持有对它的引用而不是旧的。
- 它可以创建一个可变的列表对象,但永远不会暴露给外界。如果有人需要从列表中检索项目序列,`Foo` 会将列表的内容复制到一个新列表中,调用者可以在不影响 `Foo` 列表的情况下以任何它认为合适的方式使用该列表。
如果使用方法#1,那么每次Foo
更改列表时,它都必须创建一个新的“不可变列表”实例,但Foo
可以回答对列表内容的请求,而无需复制它。如果使用方法#2,将项目添加到列表(和其他修改)将更便宜,但回答对列表内容的请求将需要复制列表。使用方法#1 还是方法#2 是否更好取决于列表更新的频率,以及应用程序需要它的副本的频率。
于 2012-06-21T21:54:27.333 回答