ArrayList <heavyojbect> clone()</heavyojbect>

时间:2013-02-14 04:54:16

标签: java performance arraylist clone

我对Java中的ArrayList的clone()方法有疑问。

ArrayList<HeavyOjbect> original = new ArrayList<HeavyOjbect>();
original.add(new HeavyOjbect(0));
original.add(new HeavyOjbect(1));
original.add(new HeavyOjbect(2));
ArrayList<Integer> copy = original;
copy.remove(0);

原创 - &gt; [HeavyOjbect1,HeavyOjbect2]

复制 - &gt; [HeavyOjbect1,HeavyOjbect2]

现在使用clone()方法

ArrayList<HeavyOjbect> original = new ArrayList<HeavyOjbect>();
original.add(new HeavyOjbect(0));
original.add(new HeavyOjbect(1));
original.add(new HeavyOjbect(2));
ArrayList<Integer> copy = (ArrayList<HeavyOjbect>) original.clone();
copy.remove(0);

原创 - &gt; [HeavyOjbect0,HeavyOjbect1,HeavyOjbect2]

复制 - &gt; [HeavyOjbect1,HeavyOjbect2]

对吧?

但我无法弄清楚克隆的作用。它是否克隆每个HeavyObject? 我的意思是如果克隆是我的ArrayList的1000倍,那么内存会爆炸吗?

编辑: 所以克隆

new HeavyOjbect(0) -> @10
new HeavyOjbect(1) -> @20
new HeavyOjbect(1) -> @30

original(ref1 to @10, ref1 to @20, ref1 to @30)
copy(ref2 to @10, ref2 to @20, ref2 to @30)

对吧?

由于

3 个答案:

答案 0 :(得分:6)

http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#clone()

  

public Object clone()
  返回此ArrayList实例的浅表副本。 (元素本身不会被复制。)

仅复制HeavyObject引用;每个克隆的ArrayList将包含对完全相同对象的引用。不会创建新的HeavyObject

编辑添加:这是“浅”和“深”副本之间的区别。如果是深拷贝,那么每个HeavyObject的副本也会被制作出来,正如你所说的......你的记忆会爆炸。

答案 1 :(得分:1)

clone()方法用于创建实现Cloneable接口的类的对象的副本。默认情况下,它会逐字段复制,因为Object类事先没有任何关于对象调用此方法的特定类的成员的任何想法。因此,如果类只有原始数据类型成员,则将创建该对象的全新副本,并返回对新对象副本的引用。但是,如果类包含任何类类型的成员,则只复制对这些成员的对象引用,因此原始对象和克隆对象中的成员引用都引用同一对象。 所以它不会爆炸任何内存。

答案 2 :(得分:0)

在本声明中

ArrayList<Integer> copy = original;

您正在考虑copy参考也指向original对象。

如果您通过copy参考修改对象,它也会在original对象上更改。

<强>克隆:

clone()方法将给出同一对象的另一个副本,因此如果你在copy对象中出现它将反映在original对象中。