gpt4 book ai didi

java - 集合分配、浅复制、惰性复制和深复制的区别和最佳方法

转载 作者:行者123 更新时间:2023-11-30 04:43:43 25 4
gpt4 key购买 nike

编辑:更新信息和答案

我试图对收集不同的复制方式有一个整体的了解。我想我已经明白了这个概念,但需要如此四舍五入,而且我需要这样的总结也很有用(请随意修改我的帖子)。我有:

集合a、b;//我省略了泛型

那么我复制该集合的机会有多大?:

  • 赋值(完全相同的对象)

    a=b
  • 浅复制(2 个差异集合,相同的对象引用,因此如果我们从一个列表中添加/删除一个对象,不会反射(reflect)在另一个列表中)

    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 中的浅层复制相同?)

  • 深度复制(具有复制对象的不同列表,因此修改一个列表或对象不会影响另一个列表或对象)

    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

我的假设正确吗?

最佳答案

作业:a 和 b 将指向同一个列表,因此那里不会有任何副本。

浅薄和懒惰似乎对我来说是等同的。对列表中对象的引用将是相同的。您可以这样说:“相同的对象将出现在两个列表中”。因此,修改一个列表中的对象也会修改第二个列表中的对象,因为这是同一个对象。

最后,我认为你应该为深层复制编写此内容:

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

这样您就可以修改列表 a 中的一个对象,而无需修改列表 b 中的副本。

警告:使用可克隆对象有一些限制。有关详细信息,请参阅 JDK 文档。

关于java - 集合分配、浅复制、惰性复制和深复制的区别和最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11631660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com