当将一个list的元素分别保存到另外五个list中后,对5个list中的对象做值修改,其实这5个list的值会同时改变,所以当需要将一个list中的元素放到另外的list或其他集合中时,不能直接使用list 的get方法以及put方法,如果不需要对元素的进行内容的修改也可以,否则需要另外新建一个对象,并将原来的对象的内容赋值给新的对象。这将使用大量的get以及set方法,另外有两种办法可以直接对原有的对象进行克隆,可以避免大量的get以及set方法,生成一个原对象的副本。这时这两个对象的内容在内存地址是不一样的。
当java 的不同方法获取同一个对象的地址引用,那任一方法都可以对这个对象内部进行修改,会对其他的引用造成影响。Java中所有的对象都是保存在堆中
克隆有两种办法,一种是对pojo实现Cloneable接口
public Object clone(){
A a = null;
try{
a = (A) ();
}catch(Exception e){
}
return a;
}
当元素的属性包含了其他的vo 或数组时,上面的clone就对这种字段仍然是引用复制,也就是指这些字段的值都是同一个内存地址的。这时需要深度克隆,其实也就是在重载clone方法时,需要针对这些字段进行克隆
public Object clone(){
A a = null;
try{
a = (A)();
= (String[])();
}catch(Exception e){
}
}
另外一种克隆是将对象序列化,使用输出流以及输入流来进行克隆,这种克隆需要将对象以及内部引用的其他对象都进行序列化。
public Object deepclone(){
Object obj = null;
try{
ByteArrayOutputStream byout = new ByteArrayOutputStream();
ObjectOutputStream obs = new ObjectOutputStream(byout);
(this);
();
ByteArrayInputStream byin = new ByteArrayInputStream(());
Object InputStream ibs = new ObjectInputStream(byin);
obj = ();
();
}catch(Exception e){
}
}