关于Android/java的复杂对象的深拷贝和浅拷贝
16lz
2021-12-04
import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public abstract class BeanCloneUtil { @SuppressWarnings("unchecked") public static T cloneTo(T src) throws RuntimeException { ByteArrayOutputStream memoryBuffer = new ByteArrayOutputStream(); ObjectOutputStream out = null; ObjectInputStream in = null; T dist = null; try { out = new ObjectOutputStream(memoryBuffer); out.writeObject(src); out.flush(); in = new ObjectInputStream(new ByteArrayInputStream(memoryBuffer.toByteArray())); dist = (T) in.readObject(); } catch (Exception e) { throw new RuntimeException(e); } finally { if (out != null) try { out.close(); out = null; } catch (IOException e) { throw new RuntimeException(e); } if (in != null) try { in.close(); in = null; } catch (IOException e) { throw new RuntimeException(e); } } return dist; }}
项目需求中遇到一个问题。需要将一个复杂的对象复制一个数据一样内存不一样的出来。
java中的复制貌似是除了数据类型之外,其他的都是传递对象内存地址。当你的这个对象中嵌套了list
但是list里面的数据对象的内存地址还是一样,当你对新的list进行操作的时候。其实操作的还是老的list中的数据对象,应为他们内存地址一样。
为了避免这种情况,网上找了很多方法,有的说用clone,尝试过之后还是不行,个人觉得是对稍微简单的对象操作应该是没有问题,
如果说对象里面嵌套了list可能就不能达到预期的效果.有的说用collection.copy,但是最终还是浅拷贝,也不能达到预期效果。最终找到上面这个,简单好用,不过需要你的class能
实现Serializable接口。这个方法返回的数据对象就是一个全新的对象,内存地址不同
更多相关文章
- 类和 Json对象
- android 利用socket 发送Json数据demo
- Android(安卓)为Notification加上一个进度条
- Android(Java):jni源代码
- adb最新版下载地址
- android 获取网络上服务器图片
- eclipse 插件网址
- 读取Android设备的MAC地址
- 简析android:installLocation