1

編集:回答を含む情報を更新

コレクションのさまざまなコピー方法の全体像を把握しようとしています。私は概念を理解していると思いますが、丸めが必要であり、そのような要約が必要です (私の投稿を自由に変更してください)。私は持っている:

コレクション a、b。//ジェネリックは省略

では、コレクションをコピーする可能性はどのくらいですか?:

  • 割り当て (まったく同じオブジェクト)

    a=b
    
  • 浅いコピー (2 つの diff コレクション、同じオブジェクト参照、したがって、1 つのリストから 1 つのオブジェクトを追加/削除しても、他のリストには反映されません)

    a = new ArrayList(b);  // Or any other implementation of Collections
    
    a = b.clone(); //This also? 
    
    b = new ArrayList(); //This also?
    for (Object o : a) b.add(a);
    
  • レイジーコピー (Java の浅いと同じ?)

  • ディープ コピー (オブジェクトがコピーされた別のリスト。1 つのリストまたはオブジェクトを変更しても、他のリストには影響しません)

    b = new ArrayList(); // Or any other implementation of Collections
    for (Object o : a) b.add(o.clone());
    

だから私はこれらのケースを想像します:

コレクションのコピー/複製 (または DAO データの返却)

                       SyncStateOfListing    OriginalListingSafe   OriginalObjectsStateSafe  
 Mutual aware of changs
 **********************
 Assignment in other var         y - Mirrored         n                      n
 Iterator*                       y - Concurrnt.Exc    n (remove())           n    

 New is aware of old´ changes (RO ProxyView)
 ******************************************

 Coll.unmodifiableColl(orig)     y - Mirrored**       y NotSuppOpExc on RW   n  
 Coll.unmodif(orig).iterator()*  y - Concurrnt.Exc    y NotSuppOpExc on RW   n
 Enum                            y - ?                y No RW methods                  

 Independent copies
 ******************
 Shallow Copy                    n                    y                      n
 Deep Copy                       n                    y                      y (expensive) 


 * Iterator we force to regenerate it in any use and we get Exceptions if at some moment the snapshot is obsolete, so we assure the state for which the operation is meant, transactionally. Cannot add elements or retraverse.
 ** The "new" collection is totally mirrored for any change on the original, but internally, inner iterator is always used when traversing (the obvious stateful operation) so we get the same properties as when using it

私の仮定でよろしいですか?

4

1 に答える 1

2

割り当て : a と b は同じリストを指すため、そこにコピーはありません。

Shallow と Lazy は私と同等のように思えます。リスト内のオブジェクトへの参照は同じになります。次のように言うかもしれません: 「同じオブジェクトが 2 つのリストに存在します」。これは同じオブジェクトであるため、1 つのリストのオブジェクトを変更すると、2 番目のリストも変更されます。

最後に、ディープコピー用にこれを書くべきだと思います:

b = new ArrayList();
for (Object o : a) b.add(o.clone()); // and not a.clone()

このようにして、リスト b のコピーを変更することなく、リスト a の 1 つのオブジェクトを変更できます。

警告: 複製可能なオブジェクトの使用にはいくつかの制限があります。詳細については、JDK ドキュメントを参照してください。

于 2012-07-24T13:41:25.717 に答える