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

阅读更多

预定义集合类型--clone方法:实际是逐个调用每个元素的operator=方法

因此,预定义集合类型的clone()结果为浅拷贝还是深拷贝,取决于其元素类型

1. 元素为预定义非集合类型

	private void testClone() {
		ArrayList listA = new ArrayList();
		listA.add("a");
		listA.add("b");
		
		ArrayList listB = (ArrayList)listA.clone();
		listB.add("c");
		
		for (String str : listA) {
			System.out.println(str);
		}
	}

 结果:

  a

  b

 结论:预定义集合类型,元素为预定义非集合类型,执行clone()方法 -- 深拷贝

 

2. 元素为预定义集合类型

	private void testClone() {
		ArrayList> listA = new ArrayList>();
		
		HashMap mapOne = new HashMap();
		mapOne.put(1, "One");
		listA.add(mapOne);
		
		HashMap mapTwo = new HashMap();
		mapTwo.put(2, "Two");
		listA.add(mapTwo);
		
		ArrayList> listB = (ArrayList)listA.clone();
		HashMap mapThree = new HashMap();
		mapThree.put(3, "mapThree");
		listB.add(mapThree);
		
		System.out.println("--> listB 增加一个新元素, 打印listA:");
		for (HashMap map : listA) {
			System.out.println("\t" + map.toString());
		}
		
		HashMap mapOneOld = listB.get(0);
		mapOneOld.put(1, "New One");
		System.out.println("--> listB 修改一个旧元素值, 打印listA:");
		for (HashMap 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> listA = new ArrayList>();
		
		HashMap mapOne = new HashMap();
		mapOne.put(1, "One");
		listA.add(mapOne);
		
		HashMap mapTwo = new HashMap();
		mapTwo.put(2, "Two");
		listA.add(mapTwo);
		
		ArrayList> listB = new ArrayList>();
		for (HashMap map : listA) {
			listB.add((HashMap)map.clone());
		}
		
		HashMap mapThree = new HashMap();
		mapThree.put(3, "mapThree");
		listB.add(mapThree);
		
		System.out.println("--> listB 增加一个新元素, 打印listA:");
		for (HashMap map : listA) {
			System.out.println("\t" + map.toString());
		}
		
		HashMap mapOneOld = listB.get(0);
		mapOneOld.put(1, "New One");
		System.out.println("--> listB 修改一个旧元素值, 打印listA:");
		for (HashMap map : listA) {
			System.out.println("\t" + map.toString());
		}
	}

 结果:

--> listB 增加一个新元素, 打印listA:
	{1=One}
	{2=Two}
--> listB 修改一个旧元素值, 打印listA:
	{1=One}
	{2=Two}

 

你可能感兴趣的:(java,拷贝,深拷贝,clone)