`
tessykandy
  • 浏览: 79210 次
  • 性别: 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深入理解浅拷贝和深拷贝

    本文将会深入的探讨一下在拷贝对象中会出现的浅拷贝和深拷贝的情况。 拷贝接口 java中所有的对象都是继承自java.lang.Object。Object对象中提供了一个clone方法,来供我们对java对象进行拷贝。 protected native ...

    Java深浅clone

    Java深浅clone测试代码 流拷贝 Cloneable

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

    主要介绍了java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

    java_clone用法

    java中clone的详细用法,分浅拷贝和深拷贝,并分别有详细的实例介绍。从原理分析。

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

    主要介绍了Java中实现深拷贝的两种方式—clone() & Serialized,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java中的指针,引用及对象的clone

    java中clone的详细用法,分浅拷贝和深拷贝,并分别有详细的实例介绍。从原理分析。

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

    浅拷贝(浅复制、浅克隆)、深拷贝(深复制、深克隆)实战工程,IDEA搭建

    结合JVM解读浅拷贝和深拷贝

    java.lang.Cloneable和java.io.Serializable一样属于标记型接口,没有定义任何方法和属性。 一个类想要使用克隆方法 重写clone()方法,因为Object的clone()的修饰符是protected; @HotSpotIntrinsicCandidate ...

    c python java 复制数组 深浅拷贝

    java: 直接使用 “=” 复制,浅拷贝,两个数组地址一样,改变其中一个,另一个也...clone() 方法 深拷贝,两个一样的数组,相互没有关系 int[] a1 = {1, 2,3}; int[] a2 = a1.clone(); a1[0] = ,0; System.out.pri

    Java原型设计模式(Prototype)

    1、定义  原型模式(Prototype)是通过复制一个已经存在的实例来返回新的实例,而不是新建实例,被复制的实例是我们所称的...  (1)利用Java中的clone方法深拷贝与浅拷贝  浅拷贝: public class Professor { pri

    javascript深拷贝(deepClone)详解

    与深拷贝相对的就是浅拷贝,很多初学者在接触这个感念的时候,是很懵逼的。 为啥要用深拷贝? 在很多情况下,我们都需要给变量赋值,给内存地址赋予一个值,但是在赋值引用值类型的时候,只是共享一个内存区域,...

    深入理解java中的拷贝机制

    主要给大家深入介绍了java中的拷贝机制,网上关于java中拷贝的文章也很多,但觉得有必要再深的介绍下java的拷贝机制,有需要的朋友可以参考学习,下面来一起看看吧。

    java设计模式

    13.4.2 浅拷贝和深拷贝 13.4.3 clone与final两个冤家 13.5 最佳实践 第14章 中介者模式 14.1 进销存管理是这个样子的吗? 14.2 中介者模式的定义 14.3 中介者模式的应用 14.4 中介者模式的实际应用 14.5 最佳实践 第...

    leetcode分类-DesignPatternAndAlgorithm:常用设计模式和算法,练习用

    leetcode 分类 DesignPatternAndAlgorithm 常用设计模式和算法,练习用。 一、设计模式: 创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 结构型模式:适配器模式...分为深拷贝和浅拷贝。 抽

Global site tag (gtag.js) - Google Analytics