正如其他人所指出的那樣,克隆ArrayList
並不克隆它的元素。如果你想做一個內容的深層副本,有一個巧妙的技巧:序列化和反序列化數組。 (這是可行的,因爲ArrayList
和Integer
都執行Serializable
。)但是,這並沒有擺脫禁止未經檢查的轉換警告的需要。
// Write the object out to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(this.items);
byte[] bytes = bos.toByteArray();
// Retrieve an input stream from the byte array and read
// a copy of the object back in.
ObjectInputStream in = new ObjectInputStream(
new ByteArrayInputStream(bytes));
ArrayList<Integer> items = (ArrayList<Integer>) in.readObject();
如果您的整個對象可以被聲明爲Serializable,那麼可以使用它來代替克隆操作來進行深度複製。此外,請參閱this article,以避免從ByteArrayOutputStream
複製字節的開銷。
當然,沒有必要對Integer對象進行深層複製。 – 2012-01-18 04:29:54