关于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方法,原来只是简单的把引用拷贝.
如果对集合的对象里面的值进行设置值还是会改变原来的缓存。
最后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());
}
}
相关文章推荐
- Ruby中的集合编写指南
- AVG 7.5.1.43 版本 序列号 集合
- SQL Server游标的使用/关闭/释放/优化小结
- 编写高质量代码改善C#程序――使用泛型集合代替非泛型集合(建议20)
- C#拷贝文件简单实现方法
- C#检查指定对象是否存在于ArrayList集合中的方法
- jquery的clone方法应用于textarea和select的bug修复
- C++中拷贝构造函数的应用详解
- C#写入对象或集合类型数据到xml文件的方法
- C#中的集合用法分析
- C#常见的几种集合 ArrayList,Hashtable,List<T>,Dictionary<K,V> 遍历方法对比
- JavaScript Archive Network 集合
- JavaScript深度复制(deep clone)的实现方法
- Backbone.js中的集合详解
- jQuery学习7 操作JavaScript对象和集合的函数
- 网页代码常用小技巧总结第1/3页
- C#运用FileInfo类实现拷贝文件的方法
- 详解JAVA高质量代码之数组与集合
- 基于Java回顾之集合的总结概述
- 探讨:如何使用委托,匿名方法对集合进行万能排序