在java中有一个比较有趣的特性,在对对象进行=赋值,或者clone时候一般都是我们所说的浅复制,

Object A = B;

也就是说我们获取的并非在堆中重新分配的一块内存,而是一个指向原有数据内存的一个引用。

这样的后果就是我们修改了A中的属性,那么B的属性也会同时发生变化,因为他们两个本身就指向同一个对象,所以变化一个另外一个也随着变化。

在Map中提供的一个putAll方法,可以部分解决这个问题,(为什么是部分呢?因为putAll方法只能对基本数据类型进行深复制,对于对象类型完全也是无力),因此急需一个好的解决方案来进行对象的深复制

有一个方法是,使用序列化Serializable这个接口可以完成深拷贝的操作,但遗憾的是Map对象并没有实现Serializable接口,不能直接对接口进行深复制操作。

public interface Map {...}

但是作为Map的子类,HashMap实现了Serialization,因此可以通过以下的方式实现深复制。

@SuppressWarnings("unchecked")

public static T clone(T obj) {

T clonedObj = null;

try {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(baos);

oos.writeObject(obj);

oos.close();

ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());

ObjectInputStream ois = new ObjectInputStream(bais);

clonedObj = (T) ois.readObject();

ois.close();

} catch (Exception e) {

e.printStackTrace();

}

return clonedObj;

}

java map深拷贝_java 实现Map的深复制相关推荐

  1. java字符串深克隆_Java中对象的深复制(深克隆)和浅复制(浅克隆)之序列化...

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. 举 ...

  2. java遍历一个map集合_Java遍历Map集合的四种方式

    Map 集合的遍历与 List 和 Set 集合不同.Map 有两组值,因此遍历时可以只遍历值的集合,也可以只遍历键的集合,也可以同时遍历.Map 以及实现 Map 的接口类(如 HashMap.Tr ...

  3. java 定义map集合_java基础-Map集合

    java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...

  4. java entryset循环_Java之Map遍历方式性能分析:ketSet 与 entrySet

    keySet():将Map中所有的键存入到Set集合中.因为set具备迭代器,所以可以以迭代方式取出所有的键,再根据get方法获取每一个键对应的值,其仅能通过get()取key. entrySet() ...

  5. java list map嵌套_Java 集合-Map集合嵌套 的遍历四种方式

    1 public static voidmain(String[] args) {2 3 HashMap> map = new HashMap>();4 5 HashMap mapin1 ...

  6. java map 实例_java中map集合嵌套形式简单示例

    定义了一个学生类,封装了id和name属性,提供一个全参构造器,并复写toSting方法 class Student{ private String id; private String name; ...

  7. java多层map遍历_java中map的多层遍历

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Map> testmap=new HashMap>();Map user1=new HashMap();user1.put(1, (float ...

  8. java clone 深复制_Java的clone():深复制与浅复制

    Java中要想自定义类的对象可以被复制,自定义类就必须实现Cloneable中的clone()方法,如下: 1 public class Student implements Cloneable { ...

  9. java map遍历_Java中Map集合的两种遍历方式

    Java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下Java中Map集合的两种遍历方式! 关于遍历Map集合的几 ...

最新文章

  1. Hive常用函数大全一览
  2. php常量数组吗,包含数组的PHP常量?
  3. WCF学习之旅—WCF寄宿前的准备(八)
  4. popup a new windows
  5. 【SpringCloud】Ribbon 负载均衡
  6. 《区块链开发指南》一一导读
  7. 拆分SharePoint 2013 中CreatedModifiedInfo 的时间
  8. Grep命令学习笔记(转)
  9. 传输表空间--使用Rman方式
  10. L298N模块详细使用教程
  11. 在麒麟V10服务器上编译安装Storm
  12. 推荐一个好用的开源的报表平台——JNPF可视化平台
  13. oppo手机计算机的隐藏功能介绍,OPPO手机6大隐藏功能,你知道吗
  14. Delphi实现shell扩展
  15. 原生JS中DOM节点相关API合集
  16. STM32F4单电梯调度系统(扫描算法)
  17. 公告——实现两个公告同屏滚动轮播(elementUi-走马灯效果实现)
  18. 股市投资必修课二十---对DCF三要素应持有的正确认知和理解
  19. 深圳第25届华南国际工业自动化、机器视觉及工业应用展览会(免费)
  20. MySQL使用存储过程批量插入数据

热门文章

  1. OpenCV(22)SIFT尺度不变特征变换(纯理论)
  2. 【opencv】(13) 案例:停车场空余车位检测,附python完整代码
  3. 【TensorFlow2.0】(4) 维度变换、广播
  4. python还是r_Python和R到底该学哪个呢
  5. Blender灯光照明与渲染视频教程 Skillshare – Blender: Product rendering for beginners
  6. 风格化手绘纹理包 CGTrader – Stylized Mix Vol. 41 – Hand Painted Texture Pack
  7. C++的STL队列实现栈
  8. java中JVM的原理【转】
  9. 米勒罗宾素性测试(Miller–Rabin primality test)
  10. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)