java.util.ArrayList.clone()是浅层拷贝。那么什么是浅拷贝呢?对于ArrayList变量就是指:两个变量指示内存中的地址是不一样的,但是变量中的元素指向同一个元素。深层拷贝是指,不仅仅变量指示的内存地址不一样,而且变量中的各个元素所指地址也是不一样的。如图:
具体内容这篇文章有介绍http://www.yiibai.com/java/util/arraylist_clone.html。下面介绍我遇到的一个例子。
这里定义一个ArrayList泛型为Integer类型的变量a1,将之克隆给a2。之后将a2中的某些元素进行移除,请问移除后的a1和a2是否相同???代码如下
ArrayList a1 = new ArrayList();
a1.add(1);
a1.add(10);
a1.add(13);
a1.add(56);
a1.add(199);
ArrayList a2 = (ArrayList) a1.clone();
System.out.println("删除之前");
System.out.println(a1);
System.out.println(a2);
a2.remove(3);
a2.remove(1);
System.out.println("删除之后");
System.out.println(a1);
System.out.println(a2);
结果是如下:
删除之前
[1, 10, 13, 56, 199]
[1, 10, 13, 56, 199]
删除之后
[1, 10, 13, 56, 199]
[1, 13, 199]
第二段代码如下:
ArrayList a1 = new ArrayList();
a1.add(1);
a1.add(10);
a1.add(13);
a1.add(56);
a1.add(199);
ArrayList a2 = new ArrayList();
a2.add(21);
a2.add(20);
a2.add(23);
a2.add(26);
a2.add(299);
ArrayList> a = new ArrayList>();
a.add(a1);a.add(a2);
ArrayList> b = (ArrayList>) a.clone();
System.out.println("删除之前");
System.out.println(a);
System.out.println(b);
a2.remove(3);
a2.remove(1);
System.out.println("删除之后");
System.out.println(a);
System.out.println(b);
运行结果:
删除之前
[[1, 10, 13, 56, 199], [21, 20, 23, 26, 299]]
[[1, 10, 13, 56, 199], [21, 20, 23, 26, 299]]
删除之后
[[1, 10, 13, 56, 199], [21, 23, 299]]
[[1, 10, 13, 56, 199], [21, 23, 299]]
相信两个例子已经非常明显的揭露了ArrayList的API函数clone是浅层拷贝。