【问题标题】:ArrayList<HeavyOjbect> clone()ArrayList<HeavyOjbect> 克隆()
【发布时间】:2013-02-14 04:54:15
【问题描述】:

我有一个关于 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);

原始 -> [HeavyOjbect1,HeavyOjbect2]

复制 -> [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);

原始 -> [HeavyOjbect0,HeavyOjbect1,HeavyOjbect2]

复制 -> [HeavyOjbect1, HeavyOjbect2]

对吗?

但我不知道克隆是做什么的。它会克隆每个 HeavyObject 吗? 我的意思是如果克隆 1000 倍我的 ArrayList,内存会爆炸吗?

编辑: 所以克隆

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)

对吗?

谢谢

【问题讨论】:

    标签: java performance arraylist clone


    【解决方案1】:

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

    公共对象克隆()
    返回此 ArrayList 实例的浅表副本。 (元素本身不会被复制。)

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        在此声明中

        ArrayList<Integer> copy = original;
        

        您正在引用copy 引用也指向original 对象。

        如果您通过copy 引用修改对象,original 对象也会更改。

        克隆:

        clone() 方法会给出同一个对象的另一个副本,因此如果您在copy 对象中进行更改,它将反映在original 对象中。

        【讨论】:

          猜你喜欢
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-06
          • 2013-12-07
          • 1970-01-01
          相关资源
          最近更新 更多