`
dr2tr
  • 浏览: 142368 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

集合的clone

 
阅读更多

之前看《高质量Java程序设计》,看到有关集合的深层拷贝(Deep Copy)和浅层拷贝(Shadow Copy)。今天试了一下。

由于集合本身就是采用引用的方式保存元素的,所以集合.clone()产生的对象其对元素的保存方式也是引用。比如,ArrayList类对象ar 中有元素student1, student2(的引用),现在copy  = ar.clone().那么copy中所保存的也只是student1 和student2 的引用。

这说明,使用集合的clone功能,并不是获得我们所想象的如同一般对象那样获得非引用的拷贝。要实现集合的拷贝,必须新建一个集合,然后将原集合中元素的clone逐一加到新的集合中。如示例程序:

//浅层拷贝

import java.util.*;
public class ShadowCopy { 

 public static void main(String[] args) throws Exception{
  Student st1 = new Student(1, "no1");
  Student st2 = new Student(2, "no2");
  
  ArrayList ar = new ArrayList();
  ar.add(st1);
  ar.add(st2);
  
  ArrayList copy = (ArrayList)ar.clone(); //直接使用集合的clone功能
  ((Student)copy.get(1)).setStudent(222, "   no22");//由结果可以看到,这里对copy的修改影响了ar。
  
  System.out.println((Student)ar.get(1));
  System.out.println((Student)copy.get(1));
 } 
}
输出:

222   no22

 

//深层拷贝

import java.util.*;
public class DeepCopy { 

 public static void main(String[] args)  throws Exception{
  Student st1 = new Student(1, "no1");
  Student st2 = new Student(2, "no2");
  
  ArrayList ar = new ArrayList();
  ar.add(st1);
  ar.add(st2);
  
  ArrayList copy = new ArrayList(); //这里演示Deep Copy的方法
  copy.add(st1.clone());
  copy.add(st2.clone());
  
  
  ((Student)copy.get(1)).setStudent(222, "   no22"); //这样,对copy的修改不会影响ar。
  
  System.out.println((Student)ar.get(1));
  System.out.println((Student)copy.get(1));
 } 
}
输出:

2no2
222   no22

 

分享到:
评论

相关推荐

    Java深浅clone

    这意味着,如果对象的字段包含可变对象(如数组或集合),那么修改副本的这些字段也会影响原始对象,因为它们共享同一个内存引用。 深克隆则是创建一个新对象,不仅复制了原始对象的字段,还复制了所有嵌套的对象。...

    java不同对象及集合的多次复制

    - **使用`clone()`或`copy()`方法**:如果集合中的元素是可克隆的,可以直接调用`clone()`方法;如果集合支持`copy()`方法(如`ArrayList`),也可以使用它进行复制。 - **使用工具类**:如Apache Commons ...

    mongocloner:一个简单的实用程序,可将数据从mongo URI克隆,追加或备份到另一个

    backup_json :从源中以json格式备份指定的集合backup_yaml :以yaml格式从源备份指定的集合append :将指定的集合从一个知名的mongo uri追加到另一个delete_target :从目标中删除指定的集合clone :将著名的mongo...

    第16章:Java集合.zip_java 集合_java集合

    `clone()`方法可以浅拷贝集合,而`Collections.copy()`方法可以深拷贝指定长度的元素。 9. **集合的遍历方式**: 除了迭代器,还可以使用增强for循环(foreach)来遍历集合。 10. **集合框架的设计模式**: ...

    java的集合帮助文档

    1. `clone()`: 创建集合的浅拷贝。 2. `toArray()`: 将集合转换为数组。 3. `Collections.addAll()`: 向集合中一次性添加多个元素。 4. `Collections.copy()`: 将一个集合的内容复制到另一个集合。 六、并发集合 ...

    Java集合案例及源代码.rar

    - 使用`clone()`、`toArray()`、`Collections.copy()`进行集合复制。 - `List`到`Array`的转换,`Arrays.asList()`将数组转换为List,`ArrayList.toArray()`将List转换回数组。 8. **集合的操作**: - 添加元素...

    YOLOV8clone资源包

    这个资源包可能是针对YOLOV8clone模型的实现、训练数据、配置文件或预训练模型的集合,对于学习和应用YOLOV8clone算法的开发者来说非常有价值。 在"ultralytics-8.1.0"这个压缩包中,我们可以推测包含的是YOLOV8...

    31.3、深复制和浅复制clone1

    如果数组或集合中包含对象,复制数组或集合时,只会复制引用,而不是实际的对象。这意味着修改副本中的对象会影响到原始数组或集合中的对象。 接下来,我们讨论深复制。深复制是指创建一个新的对象,其所有属性...

    第9章C#4.0数组和集合

    此外,还有 `BinarySearch` 进行二分查找,`Clone` 创建数组的浅拷贝,`Copy/CopyTo` 复制数组到另一个数组等。 集合在C#中扮演着重要角色,特别是对于动态数据管理。ArrayList 类提供了一种动态扩展的数组,可以...

    Java集合知识体系.zip

    另外,不可忽视的是集合的拷贝、合并和转换操作,比如clone()、copy()、toArray()以及Collections工具类提供的静态方法。这些功能可以帮助我们更好地管理和操作集合。 在高级主题中,我们还会接触到集合的优化策略...

    java基础之集合面试题共4页.pdf.zip

    8. **集合拷贝**:clone()、copyOf()和构造函数之间的区别。 9. **集合转换**:List转Set,List转Array,以及流(Stream)操作的转换。 10. **面试技巧**:如何根据场景选择合适的集合,如何解释和分析代码性能,以及...

    java常用集合类总结

    - 集合的复制:`clone()`和`toArray()`方法可以创建集合的副本。 - 集合的比较:`equals()`和`hashCode()`方法用于比较集合内容是否相等。 - 集合的并发操作:Java的并发库提供`ConcurrentHashMap`和`...

    java常用方法集合

    ### Java常用方法集合 #### 一、`java.lang.*`包概述 `java.lang.*` 包含了Java语言中最基本且最常用的类,这些类是自动导入到每一个程序中的,因此无需显式地导入。它包括了如 `String`, `Integer`, `System`, `...

    Java_jihe2.rar_java集合

    - `clone()`:浅拷贝,只复制对象引用。 - `Collections.copy()`:深拷贝,实际复制元素。 - `addAll()`:将一个集合中的元素添加到另一个集合。 通过学习和实践“Java_jihe2”中的源码,你可以更深入地理解这些...

    回到基础封装集合Java开发Java经验技巧共3页.pdf

    5. **集合的复制和转换**:clone()方法、Arrays.asList()、Collections工具类等用于集合之间的复制和转换。 6. **集合的并发处理**:Java提供了Concurrent包,如ConcurrentHashMap和CopyOnWriteArrayList,用于在多...

    Clone

    9. **集合的克隆**:如果对象是一个集合,那么在克隆时需要对集合的每个元素进行深拷贝,因为集合的`clone()`方法默认执行的是浅拷贝。 总结起来,"Clone"在Java编程中是一个重要的概念,涉及到对象复制和数据一致...

    JQuery经典案例集合

    还有`.data()`用于存储和检索元素关联的数据,`.append()`、`.prepend()`用于DOM操作,`.clone()`复制元素,`.remove()`删除元素,这些都是JQuery常用的功能。 最后,JQuery的链式操作和封装思想是其设计理念的重要...

    Ajax-Twitter-Clone.zip

    Ajax-Twitter-Clone.zip,使用django和django rest api的博客应用程序,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新...

    Ajax-instagram-clone.zip

    Ajax-instagram-clone.zip,我课程的源代码:如何使用ruby on rails构建instagram https://www.udemy.com/course/1648774/,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和...

Global site tag (gtag.js) - Google Analytics