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

预定义集合类型--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}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值