您的位置:首页 > 编程语言 > Java开发

关于java的clone方法

2016-05-17 22:23 495 查看
最近编写一个类是把数据库的数据拉取到内存,然后用单利去获取数据。

在使用过程中发现缓存的值被改变了。

查看了获取缓存的方法,是拷贝一个集合返回。

查看了下这个集合clone方法,原来只是简单的把引用拷贝.

如果对集合的对象里面的值进行设置值还是会改变原来的缓存。

最后2解决方案,

1.创建一个新的集合每一个元素都拷贝一次添加到新的集合。

2.创建一个自己的list,这个list改写clone方法,深度拷贝

java的clone方法也非常有局限性,可以考虑使用序列化

public static void main(String[] args) throws Exception {
TestVo vo = new TestVo("11");
ArrayList<TestVo> l = new ArrayList<TestVo>();
l.add(vo);
System.out.println(l);
ArrayList<TestVo> l2 = (ArrayList<TestVo>) l.clone();
l2.get(0).deepClone().name = "22";
System.out.println(l);
}

public static class TestVo implements Serializable {
public String name;

public TestVo(String name){
super();
this.name = name;
}

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}

@Override
public String toString() {
return "TestVo [name=" + name + "]";
}

public TestVo deepClone() throws Exception {
// 将对象写到流里
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
// 从流里读出来
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (TestVo) (oi.readObject());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  clone 拷贝 集合