`
tessykandy
  • 浏览: 80707 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java的深拷贝和浅拷贝--clone()方法(二)

    博客分类:
  • JAVA
阅读更多

预定义集合类型--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 Clone 是 Java 语言中的一种复制对象的机制,它可以将一个对象的所有属性和状态复制到另一个对象中,实现对象的深拷贝和浅拷贝。下面我们将讨论 Java 中的深拷贝和浅...

    Java中的深拷贝(深复制)和浅拷贝(浅复制) 示例代码

    为了理解深拷贝(深复制)和浅拷贝(浅复制),我们需要首先了解Java对象内存的分配方式以及引用的概念。 1. **对象复制的基础** 在Java中,当我们创建一个对象时,系统会在内存中为该对象分配一块空间,存储它的...

    java深入理解浅拷贝和深拷贝

    在Java编程中,深入理解浅拷贝和深拷贝是非常重要的概念,特别是在处理对象复制时。浅拷贝和深拷贝的区别在于复制对象时对内存中数据的处理方式。 浅拷贝(Shallow Copy)指的是创建一个新的对象,该对象与原对象...

    java对象的深拷贝和浅拷贝[归类].pdf

    在Java编程中,对象拷贝是常见的操作,主要分为两种类型:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种拷贝方式在处理对象时有着本质的区别,对于理解对象复制机制以及在实际开发中正确地复制复杂对象至关...

    Java中的深拷贝(深复制)和浅拷贝(浅复制)介绍

    在Java编程语言中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种不同的对象复制方式,它们涉及到内存中数据的复制和引用的处理。理解这两种拷贝方式对于开发过程中正确管理和操作对象至关重要。 浅拷贝,又...

    详解java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝)

    在Java编程中,深拷贝和浅拷贝是两种复制对象的方法,它们涉及到对象的内存管理以及对象引用的处理。本文将深入探讨这两种拷贝方式,并着重讲解如何通过重写`clone()`方法以及使用序列化来实现深拷贝。 1. 浅拷贝:...

    《剑指offer》Java浅拷贝和深拷贝.pdf

    Java中的对象拷贝是一个重要的...总之,理解Java中的浅拷贝和深拷贝对于编写可维护和可扩展的代码至关重要,尤其是在处理复杂的数据结构和对象依赖时。掌握这些概念可以帮助你更好地应对面试挑战和解决实际编程问题。

    浅谈Java中实现深拷贝的两种方式—clone() & Serialized

    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 List 深度复制方法

    在Java中,当我们使用`clone()`方法或`System.arraycopy()`进行复制时,通常得到的是浅复制的结果。这意味着原始对象和复制对象中的引用指向内存中的同一块区域。如果List中的元素是基本类型,这种复制方式是没问题...

    java_clone用法

    ### Java中的`clone`方法详解:浅拷贝与深拷贝 #### 一、引言 在Java中,`clone`方法提供了一种快速复制对象的方式。它属于`Object`类的一部分,但需要显式地在子类中声明并实现`Cloneable`接口才能正常使用。本文...

    Java中clone方法共6页.pdf.zip

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个方法来源于`java.lang.Object`类,所有Java类都默认继承了这个方法。本资料"Java中clone方法共6页.pdf.zip"可能包含了关于...

    Java 细数浅拷贝和深拷贝

    在Java开发中,理解和掌握浅拷贝与深拷贝的概念及其实现方式是非常重要的。它们不仅关乎对象的内存管理和生命周期,也是解决复杂对象管理问题的基础。根据具体情况选择合适的拷贝策略,有助于提高程序的性能和维护性...

    android 浅复制和深复制-Java Generic Deep Copy 篇

    本文将深入探讨Java中的浅复制和深复制,并以Android为背景,结合具体的实例讲解如何实现Java泛型深拷贝。 首先,我们要理解浅复制和深复制的概念。浅复制(Shallow Copy)是指创建一个新的对象,然后将原对象引用...

    java clone

    默认的`clone`方法是浅拷贝,如果需要深拷贝,需要在子类中自行处理。 下面是一些关于`clone`的实践心得: 1. 注意权限:默认情况下,`clone`方法是`protected`的,这意味着在同一个包内的类才能直接调用。如果需要...

    浅拷贝(浅复制、浅克隆)、深拷贝(深复制、深克隆)实战工程

    在Java中,实现浅拷贝和深拷贝有多种方法: 1. **实现Cloneable接口**:这是Java提供的标准克隆机制。当一个类实现了Cloneable接口并重写了`clone()`方法,就可以调用`clone()`来复制对象。默认的`clone()`方法执行...

    Java深复制与浅复制&Clone

    深复制的实现通常需要自定义逻辑,因为Java的`clone()`方法不支持自动的深复制。可以使用序列化(Serialization)和反序列化(Deserialization)来实现深复制,或者手动编写代码递归复制所有属性。例如: ```java ...

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...

    java clone的小例子

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...

    Java实现实体类拷贝[深,很深的那种...]

    在Java中,`Object`类的`clone()`方法实现的就是浅拷贝。 - **深拷贝**:在深拷贝中,创建的是一个完全独立的对象,包括所有引用的对象也进行了复制。即使原始对象的属性被修改,新对象的属性也不会受到影响。实现...

Global site tag (gtag.js) - Google Analytics