今天的一段代码:
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