关于Android/java的复杂对象的深拷贝和浅拷贝
16lz
2021-01-23
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接口。这个方法返回的数据对象就是一个全新的对象,内存地址不同
更多相关文章
- adb最新版下载地址
- 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引
- Android 异步获取网络图片并处理图片Out Of Memory 内存溢出问题
- android取得账户(邮件地址)
- android 使用Intent传递对象 Serializable 或者 Parcelabel 《第
- Android从SD卡和Res读取图片,防止发生OOM内存移除
- 查看基于Android 系统单个进程内存、CPU使用情况的几种方法
- 【转】android好文章或博客地址收藏