如何实现ArrayList<E>泛型的复制

来源:互联网 发布:常用数据结构和算法 编辑:程序博客网 时间:2024/06/06 21:16

       问题解释:

       现在一个类ImmutableQueue里有一个私有变量iQueue,这是一个ArrayList<E>泛型变量。我现在要得到他的一个副本,以便对这个私有变量的内容进行访问,并且不修改iQueue的内容。

解决:

       首先说System.arraycopy(),直接写System.arraycopy(iQueue,0,CopyQueue,0,size),会报错: 

        ArrayStoreException。似乎是因为arraycopy不支持泛型。

       用Addall倒是不会报错,奇怪的是Addall其实是System.arraycopy()实现的,不太清楚为什么。但是无论是addall还是arraycopy(),都是浅复制,如果对CopyQueue,可能会影响到原来变量的内容。

下面回顾一下深复制和浅复制。

        比如一个类:      

</pre><pre name="code" class="java">class A{    int value;    B b}class B{    char key;}

               a中有另一个类b的对象的引用,那么对A的一个对象a1的浅复制a2,他们的b都指向同一个B的对象。如果是深复制,则他们的b指向不同的B对象。clone是浅复制,arraycopy也是浅复制。深复制使用序列化来完成,这里借鉴下别人的代码: 首先要在原来的类后面加implements Serializable:  

        然后写deepcopy的函数:

public ArrayList<E> getQueueCopy() throws Exception{  ByteArrayOutputStream byteOut = new ByteArrayOutputStream();  ObjectOutputStream out = new ObjectOutputStream(byteOut);  out.writeObject(iQueue);    ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());  ObjectInputStream in = new ObjectInputStream(byteIn);    @SuppressWarnings("unchecked")ArrayList<E> CopyQueue = (ArrayList<E>) in.readObject();  return CopyQueue;   }

        但是要求你的E也是实现了序列化的类。不然似乎也不行……希望以后能找到比较好的方法。

0 0
原创粉丝点击