最近在写一个项目,需要大量用到深度克隆,由于对于算法的效率要求非常高,所以我重载了所有可能被克隆的类的clone方法,但现在有的类包含一个List,这个List中的元素都已经重载了clone方法实现了深度克隆,那现在我该如何克隆这个List。我已经试过了对于List中每个对象自己手动去克隆,再依次加入新的List中,很可惜,这个方法的效率过低,这样做程序的20%的时间都在用来做克隆,所以有没有什么快速的方法实现List深度克隆,List中每个元素都已经重载了clone方法实现了深度克隆。这个List是ArrayList,如果需要,我可以改成普通的数组,但最好不要这样做。

解决方案 »

  1.   

    只能一个一个的add(obj.clone()) ;
      

  2.   

    。额,如果这样的话,那太浪费时间了,目前deep copy用了20%的时间,如果有什么方法直接对List进行Deep copy的话(我是指高速的native方法),那就好了
      

  3.   

    clone 分为shallow 和deep 两种,shallow克隆的只是引用和基本数据类型,deep克隆的是完全的新的数据
      

  4.   

    scala 有list.map(f)
    查了源码也是一个个add
      

  5.   

    ArrayList顺序遍历速度本身就比数组低很多,如果不能提高克隆速度,就只能用数组提高遍历速度。
      

  6.   

    public Object deepClone(Object  src) {
    Object o = null;
    try {
    if (src != null) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(src);
    oos.close();
    ByteArrayInputStream bais = new ByteArrayInputStream(
    baos.toByteArray());
    ObjectInputStream ois = new ObjectInputStream(bais);
    o = ois.readObject();
    ois.close();
    }
    } catch (IOException e) {
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    return o;
    }
      

  7.   

    序列化我试过,这个方法通用性非常强,代价是效率非常差,如果我使用序列化实现deep copy,程序90%以上的时间都在做deep copy,所以我覆盖了所有的clone方法实现deep copy.序列化这个方法对于效率要求很低的情况下,是个非常好的解决方案,但对于要求效率的算法,就不能用序列话了
      

  8.   

    system.arraycopy也是浅克隆吗,前提条件依然是数组中的全部元素都已经实现了clone方法
      

  9.   

    http://www.iteye.com/topic/551430 希望这篇文章对你有帮助
      

  10.   

    楼主你全部重写了clone方法有没有发现虽然这个这个对象是也是重新复制一份,但是你这里的克隆是浅克隆 只复制当前对象 它里面的对象的成员变量将不复制出单独的一份 而是指向你原来的对象的成员变量的对象  ?
      

  11.   

    我知道什么是浅克隆和深克隆,你说的这个我也懂,我重写每个对象的clone方法就是为了防止你说的情况出现,重写clone后我已经把所有的浅克隆变成了深克隆