之前看《高质量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
分享到:
相关推荐
这意味着,如果对象的字段包含可变对象(如数组或集合),那么修改副本的这些字段也会影响原始对象,因为它们共享同一个内存引用。 深克隆则是创建一个新对象,不仅复制了原始对象的字段,还复制了所有嵌套的对象。...
- **使用`clone()`或`copy()`方法**:如果集合中的元素是可克隆的,可以直接调用`clone()`方法;如果集合支持`copy()`方法(如`ArrayList`),也可以使用它进行复制。 - **使用工具类**:如Apache Commons ...
backup_json :从源中以json格式备份指定的集合backup_yaml :以yaml格式从源备份指定的集合append :将指定的集合从一个知名的mongo uri追加到另一个delete_target :从目标中删除指定的集合clone :将著名的mongo...
`clone()`方法可以浅拷贝集合,而`Collections.copy()`方法可以深拷贝指定长度的元素。 9. **集合的遍历方式**: 除了迭代器,还可以使用增强for循环(foreach)来遍历集合。 10. **集合框架的设计模式**: ...
1. `clone()`: 创建集合的浅拷贝。 2. `toArray()`: 将集合转换为数组。 3. `Collections.addAll()`: 向集合中一次性添加多个元素。 4. `Collections.copy()`: 将一个集合的内容复制到另一个集合。 六、并发集合 ...
- 使用`clone()`、`toArray()`、`Collections.copy()`进行集合复制。 - `List`到`Array`的转换,`Arrays.asList()`将数组转换为List,`ArrayList.toArray()`将List转换回数组。 8. **集合的操作**: - 添加元素...
这个资源包可能是针对YOLOV8clone模型的实现、训练数据、配置文件或预训练模型的集合,对于学习和应用YOLOV8clone算法的开发者来说非常有价值。 在"ultralytics-8.1.0"这个压缩包中,我们可以推测包含的是YOLOV8...
如果数组或集合中包含对象,复制数组或集合时,只会复制引用,而不是实际的对象。这意味着修改副本中的对象会影响到原始数组或集合中的对象。 接下来,我们讨论深复制。深复制是指创建一个新的对象,其所有属性...
此外,还有 `BinarySearch` 进行二分查找,`Clone` 创建数组的浅拷贝,`Copy/CopyTo` 复制数组到另一个数组等。 集合在C#中扮演着重要角色,特别是对于动态数据管理。ArrayList 类提供了一种动态扩展的数组,可以...
另外,不可忽视的是集合的拷贝、合并和转换操作,比如clone()、copy()、toArray()以及Collections工具类提供的静态方法。这些功能可以帮助我们更好地管理和操作集合。 在高级主题中,我们还会接触到集合的优化策略...
8. **集合拷贝**:clone()、copyOf()和构造函数之间的区别。 9. **集合转换**:List转Set,List转Array,以及流(Stream)操作的转换。 10. **面试技巧**:如何根据场景选择合适的集合,如何解释和分析代码性能,以及...
- 集合的复制:`clone()`和`toArray()`方法可以创建集合的副本。 - 集合的比较:`equals()`和`hashCode()`方法用于比较集合内容是否相等。 - 集合的并发操作:Java的并发库提供`ConcurrentHashMap`和`...
### Java常用方法集合 #### 一、`java.lang.*`包概述 `java.lang.*` 包含了Java语言中最基本且最常用的类,这些类是自动导入到每一个程序中的,因此无需显式地导入。它包括了如 `String`, `Integer`, `System`, `...
- `clone()`:浅拷贝,只复制对象引用。 - `Collections.copy()`:深拷贝,实际复制元素。 - `addAll()`:将一个集合中的元素添加到另一个集合。 通过学习和实践“Java_jihe2”中的源码,你可以更深入地理解这些...
5. **集合的复制和转换**:clone()方法、Arrays.asList()、Collections工具类等用于集合之间的复制和转换。 6. **集合的并发处理**:Java提供了Concurrent包,如ConcurrentHashMap和CopyOnWriteArrayList,用于在多...
9. **集合的克隆**:如果对象是一个集合,那么在克隆时需要对集合的每个元素进行深拷贝,因为集合的`clone()`方法默认执行的是浅拷贝。 总结起来,"Clone"在Java编程中是一个重要的概念,涉及到对象复制和数据一致...
还有`.data()`用于存储和检索元素关联的数据,`.append()`、`.prepend()`用于DOM操作,`.clone()`复制元素,`.remove()`删除元素,这些都是JQuery常用的功能。 最后,JQuery的链式操作和封装思想是其设计理念的重要...
Ajax-Twitter-Clone.zip,使用django和django rest api的博客应用程序,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新...
Ajax-instagram-clone.zip,我课程的源代码:如何使用ruby on rails构建instagram https://www.udemy.com/course/1648774/,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和...