今天的一段代碼:
??? List lista = new ArrayList();
??? /*
????賦值給lista
?? */
?? List listb = (ArrayList)((ArrayList)lista.clone());
?? /*
?? 用iterator取出內容進行修改
?? */
? 問題出現了:現在再用lista時,發現它的內容被修改過了。這是為什么呢?我??? 已clone()了呀。原來Java中List(包括Map等)的clone()執行的是shadow clone,也就是它只是拷貝了引用,如果將clone()后的內容進行了修改,它就會不知不覺中將原來的內容也進行了更改(其實就是一個)。
解決方法:自己進行deep clone()
List listb = new ArrayList();
for(Iterator ie = lista.iterator();ie.hasNext();)
{
??? Object a = (Object)ie.next();
??? Object b = new Object(a.get.., ..., ...);
??? listb.add(b);
}
注意:用List的addAll之類方法也是shadow clone