1

任何人都知道 List 复制 impl 仅在突变时才实际制作副本?对于以读取为主的用例,它(编辑:可能)比new ArrayList<>(oldList). 就像CopyOnWriteArrayList它只会复制元素零次或一次。

例子:

List list = Lists.lazyCopy(oldList);     // no copy
list.get(0);                             // delegate to oldList
list.set(0, null);                       // make a copy, mutate the copy
list.get(0);                             // read from copy
list.set(0, null);                       // mutate the copy, don't copy again
4

1 回答 1

-1

正如您在评论中提到的那样,您有一个:为什么不在您的 ImmutableList 中com.google.common.collect.ImmutableList使用简单的?java.util.concurrent.CopyOnWriteArrayList

CopyOnWriteArrayList(Collection<? extends E> c) 只需使用源集合的toArray方法来创建 CopyOnWriteArrayList 的支持数组。并且非单例、非空的RegularImmutableList 的实现toArray也只是将System.arraycopy从它自己的后备数组复制到一个新数组。因此,新的后备数组和 System.arraycopy 只有一个大内存分配,在任何一种情况下都应该很快。当然,缺点是重复的后备数组的内存使用量增加。

于 2012-11-12T18:43:28.587 回答