文章参考:https://juejin.im/post/5c988a7ef265da6116246d11
拷贝的目的
大多数情况下是在新的上下文环境中复用原有对象的大部分或全部数据
浅拷贝
1.浅拷贝对象为基本数据类型: 将基本数据类型的值 拷贝一份
2. 浅拷贝对象为引用数据类型: 将该对象的地址拷贝一份 若修改了原数据的值 就会影响拷贝的对象的值
3. 实现 直接调用Object.copy()即可
深拷贝
1.深拷贝对象为基本数据类型: 将对象的值拷贝一份
2.深拷贝对象为引用数据类型: 创建一个新的对象 和被拷贝对象一致 将被拷贝对象的所有值放入新的对象中 从此旧有对象做的所有改变不会再影响到新拷贝的对象
3.实现 重写clone()方法 创建一个相同的对象
4.缺点: 相对于浅拷贝时间长 花销大
浅拷贝与深拷贝的选择
- 当数据类型全部是基本数据类型时 应该使用浅拷贝
- 当数据类型有引用类型时 要根据具体需求 如果对象的值不会被改变 则应该选择浅拷贝 若引用对象经常发生改变 应该使用深拷贝
序列化进行拷贝
- 定义 将对象写入到一个可持久保存的序列文件中,并在需要的时候将它读取出来 属于深拷贝
- 要求: 被序列化拷贝的对象需要实现Serializable接口
- 实现
3.1 确保对象图中的所有类都是可序列化的
3.2创建输入输出流
3.3使用这个输入输出流来创建对象输入和对象输出流
3.4将你想要拷贝的对象传递给对象输出流
3.5从对象输入流中读取新的对象并且转换回你所发送的对象的类
延迟拷贝
- 定义 是浅拷贝和深拷贝的组合
- 在拷贝一开始使用的浅拷贝 并使用一个计数器来记录有多少对象共享这个数据 他会决定被共享数据是否需要深拷贝 实际很少用到