1

変更されたときにのみ実際にコピーを作成する List copy impl を知っている人はいますか? 読み取りが支配的なユースケースの場合、(編集:可能性があります)よりも効率的ですnew ArrayList<>(oldList)CopyOnWriteArrayList要素を0回または1回だけコピーすることを除いて、似ています。

例:

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

あなたが持っているコメントで言及したように、ImmutableListcom.google.common.collect.ImmutableListで単純なものを使用しないのはなぜですか?java.util.concurrent.CopyOnWriteArrayList

CopyOnWriteArrayList(Collection<? extends E> c) ソース コレクションのtoArrayメソッドを使用して、CopyOnWriteArrayList のバッキング配列を作成するだけです。また、シングルトンでも空でもない RegularImmutableList の実装toArrayも、独自のバッキング配列から新しい配列へのSystem.arraycopy を 1 回実行するだけです。そのため、新しいバッキング アレイと System.arraycopy に対して 1 つのメモリ大規模な割り当てしかなく、どちらの場合も非常に高速である必要があります。もちろん、欠点は複製されたバッキング配列のメモリ使用量が増加することです。

于 2012-11-12T18:43:28.587 に答える