预定义集合类型--clone方法:实际是逐个调用每个元素的operator=方法
因此,预定义集合类型的clone()结果为浅拷贝还是深拷贝,取决于其元素类型
1. 元素为预定义非集合类型
private void testClone() { ArrayList<String> listA = new ArrayList<String>(); listA.add("a"); listA.add("b"); ArrayList<String> listB = (ArrayList)listA.clone(); listB.add("c"); for (String str : listA) { System.out.println(str); } }
结果:
a
b
结论:预定义集合类型,元素为预定义非集合类型,执行clone()方法 -- 深拷贝
2. 元素为预定义集合类型
private void testClone() { ArrayList<HashMap<Integer, String>> listA = new ArrayList<HashMap<Integer, String>>(); HashMap<Integer, String> mapOne = new HashMap<Integer, String>(); mapOne.put(1, "One"); listA.add(mapOne); HashMap<Integer, String> mapTwo = new HashMap<Integer, String>(); mapTwo.put(2, "Two"); listA.add(mapTwo); ArrayList<HashMap<Integer, String>> listB = (ArrayList)listA.clone(); HashMap<Integer, String> mapThree = new HashMap<Integer, String>(); mapThree.put(3, "mapThree"); listB.add(mapThree); System.out.println("--> listB 增加一个新元素, 打印listA:"); for (HashMap<Integer, String> map : listA) { System.out.println("\t" + map.toString()); } HashMap<Integer, String> mapOneOld = listB.get(0); mapOneOld.put(1, "New One"); System.out.println("--> listB 修改一个旧元素值, 打印listA:"); for (HashMap<Integer, String> map : listA) { System.out.println("\t" + map.toString()); } }
结果:
--> listB 增加一个新元素, 打印listA: {1=One} {2=Two} --> listB 修改一个旧元素值, 打印listA: {1=New One} {2=Two}
结论:预定义集合类型,元素为预定义集合类型,执行clone()方法 -- 实际是逐个调用每个元素的operator=方法,即这时的clone()方法其实为浅拷贝。
3. 元素为预定义集合类型,通过遍历元素的clone方法实现深拷贝
private void testClone() { ArrayList<HashMap<Integer, String>> listA = new ArrayList<HashMap<Integer, String>>(); HashMap<Integer, String> mapOne = new HashMap<Integer, String>(); mapOne.put(1, "One"); listA.add(mapOne); HashMap<Integer, String> mapTwo = new HashMap<Integer, String>(); mapTwo.put(2, "Two"); listA.add(mapTwo); ArrayList<HashMap<Integer, String>> listB = new ArrayList<HashMap<Integer, String>>(); for (HashMap<Integer, String> map : listA) { listB.add((HashMap<Integer, String>)map.clone()); } HashMap<Integer, String> mapThree = new HashMap<Integer, String>(); mapThree.put(3, "mapThree"); listB.add(mapThree); System.out.println("--> listB 增加一个新元素, 打印listA:"); for (HashMap<Integer, String> map : listA) { System.out.println("\t" + map.toString()); } HashMap<Integer, String> mapOneOld = listB.get(0); mapOneOld.put(1, "New One"); System.out.println("--> listB 修改一个旧元素值, 打印listA:"); for (HashMap<Integer, String> map : listA) { System.out.println("\t" + map.toString()); } }
结果:
--> listB 增加一个新元素, 打印listA: {1=One} {2=Two} --> listB 修改一个旧元素值, 打印listA: {1=One} {2=Two}
相关推荐
Java Clone 深拷贝与浅拷贝的两种实现方法 Java Clone 是 Java 语言中的一种复制对象的机制,它可以将一个对象的所有属性和状态复制到另一个对象中,实现对象的深拷贝和浅拷贝。下面我们将讨论 Java 中的深拷贝和浅...
为了理解深拷贝(深复制)和浅拷贝(浅复制),我们需要首先了解Java对象内存的分配方式以及引用的概念。 1. **对象复制的基础** 在Java中,当我们创建一个对象时,系统会在内存中为该对象分配一块空间,存储它的...
在Java编程中,深入理解浅拷贝和深拷贝是非常重要的概念,特别是在处理对象复制时。浅拷贝和深拷贝的区别在于复制对象时对内存中数据的处理方式。 浅拷贝(Shallow Copy)指的是创建一个新的对象,该对象与原对象...
在Java编程中,对象拷贝是常见的操作,主要分为两种类型:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种拷贝方式在处理对象时有着本质的区别,对于理解对象复制机制以及在实际开发中正确地复制复杂对象至关...
在Java编程语言中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种不同的对象复制方式,它们涉及到内存中数据的复制和引用的处理。理解这两种拷贝方式对于开发过程中正确管理和操作对象至关重要。 浅拷贝,又...
在Java编程中,深拷贝和浅拷贝是两种复制对象的方法,它们涉及到对象的内存管理以及对象引用的处理。本文将深入探讨这两种拷贝方式,并着重讲解如何通过重写`clone()`方法以及使用序列化来实现深拷贝。 1. 浅拷贝:...
Java中的对象拷贝是一个重要的...总之,理解Java中的浅拷贝和深拷贝对于编写可维护和可扩展的代码至关重要,尤其是在处理复杂的数据结构和对象依赖时。掌握这些概念可以帮助你更好地应对面试挑战和解决实际编程问题。
Java中实现深拷贝的两种方式—clone()和Serialized—are two effective methods to achieve deep copying in Java. By understanding the differences and trade-offs between these two methods, we can choose the...
在Java中,当我们使用`clone()`方法或`System.arraycopy()`进行复制时,通常得到的是浅复制的结果。这意味着原始对象和复制对象中的引用指向内存中的同一块区域。如果List中的元素是基本类型,这种复制方式是没问题...
### Java中的`clone`方法详解:浅拷贝与深拷贝 #### 一、引言 在Java中,`clone`方法提供了一种快速复制对象的方式。它属于`Object`类的一部分,但需要显式地在子类中声明并实现`Cloneable`接口才能正常使用。本文...
在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个方法来源于`java.lang.Object`类,所有Java类都默认继承了这个方法。本资料"Java中clone方法共6页.pdf.zip"可能包含了关于...
在Java开发中,理解和掌握浅拷贝与深拷贝的概念及其实现方式是非常重要的。它们不仅关乎对象的内存管理和生命周期,也是解决复杂对象管理问题的基础。根据具体情况选择合适的拷贝策略,有助于提高程序的性能和维护性...
本文将深入探讨Java中的浅复制和深复制,并以Android为背景,结合具体的实例讲解如何实现Java泛型深拷贝。 首先,我们要理解浅复制和深复制的概念。浅复制(Shallow Copy)是指创建一个新的对象,然后将原对象引用...
默认的`clone`方法是浅拷贝,如果需要深拷贝,需要在子类中自行处理。 下面是一些关于`clone`的实践心得: 1. 注意权限:默认情况下,`clone`方法是`protected`的,这意味着在同一个包内的类才能直接调用。如果需要...
在Java中,实现浅拷贝和深拷贝有多种方法: 1. **实现Cloneable接口**:这是Java提供的标准克隆机制。当一个类实现了Cloneable接口并重写了`clone()`方法,就可以调用`clone()`来复制对象。默认的`clone()`方法执行...
深复制的实现通常需要自定义逻辑,因为Java的`clone()`方法不支持自动的深复制。可以使用序列化(Serialization)和反序列化(Deserialization)来实现深复制,或者手动编写代码递归复制所有属性。例如: ```java ...
java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...
在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...
在Java中,`Object`类的`clone()`方法实现的就是浅拷贝。 - **深拷贝**:在深拷贝中,创建的是一个完全独立的对象,包括所有引用的对象也进行了复制。即使原始对象的属性被修改,新对象的属性也不会受到影响。实现...