首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >差异和最佳方式做收藏的分配,浅拷贝,延迟复制和深拷贝

差异和最佳方式做收藏的分配,浅拷贝,延迟复制和深拷贝
EN

Stack Overflow用户
提问于 2012-07-24 13:14:14
回答 1查看 539关注 0票数 1

编辑:包含答案的更新信息

我试图有一个全面的观点,收集不同的方式复制。我想我得到了这个概念,但我需要如此四舍五入,我也需要有这样一个总结(请随时修改我的帖子)是有用的。我有:

集合a,b;//I省略泛型

那么我复制收藏的机会有多大呢?:

  • 分配(完全相同的对象) a=b
  • 浅拷贝(2个diff集合,相同的对象引用,因此如果我们从一个列表中添加/删除一个对象,则另一个列表中没有反映一个对象)a=新的ArrayList(b);//或集合的任何其他实现--a= b.clone();//这也是吗?B=新的ArrayList();//这也是?用于(对象o: a) b.add(a);
  • 延迟复制(与java中的浅拷贝相同?)
  • 深度复制(具有复制对象的不同列表,因此修改一个列表或对象不会影响另一个列表或对象) B=新的ArrayList();//或(对象o: a) b.add(o.clone())的任何其他集合实现;

所以我想这些案例:

收集复制/复制(或返回DAO数据)

代码语言:javascript
复制
                       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

我的假设还好吗?

EN

回答 1

Stack Overflow用户

发布于 2012-07-24 13:41:25

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

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

最后,我认为你应该把这篇文章写得很深:

代码语言:javascript
复制
b = new ArrayList();
for (Object o : a) b.add(o.clone()); // and not a.clone()

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11631660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档