问题解释:
现在一个类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也是实现了序列化的类。不然似乎也不行……希望以后能找到比较好的方法。