任何人都知道列表副本暗示仅在突变时才真正制作副本吗?对于以阅读为主的用例,它(编辑:可能)比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

最佳答案

正如您在评论中提到的,您有一个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,无论哪种情况,whosh都应该非常快。当然,缺点是复制后备阵列的内存使用量增加。

10-08 03:14