懒惰列表副本(写入时复制)

时间:2012-11-12 18:20:02

标签: java collections

任何人都知道列表副本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

1 个答案:

答案 0 :(得分:-1)

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

CopyOnWriteArrayList(Collection<? extends E> c) simply uses the source collection's toArray method创建CopyOnWriteArrayList的后备数组。非单例,非空的RegularImmutableList的toArray实现也只是从它自己的后备数组到新数组one System.arraycopy。因此,对于新的后备阵列和System.arraycopy只有一个内存大量分配,在任何一种情况下都应该非常快。当然,缺点是重复的后备阵列的内存使用量增加。