Map拷贝 关于对象深拷贝 浅拷贝的问题
2015-12-01 10:11
381 查看
上面程序的期望输出值是,
mapFrist的值均为1,
但是实际上输出结果为:
{key1=1}
{key2=2, key1=1}
这里是因为map发生了浅拷贝,mapFirst只是复制了map的引用,和map仍使用同一个内存区域,所以,在修改map的时候,mapFirst的值同样会发生变化。
浅复制:则是只复制对象的引用,两个引用仍然指向同一个对象,在内存中占用同一块内存。被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深复制:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
如何解决?
使用深拷贝,拷贝整个对象,而非引用
Map中有个方法叫做putAll方法,可以实现深拷贝,如下
如上,输出结果为:
{key1=1}
{key1=1}
相关文章推荐
- 清除浮动方法总结
- 关于Linux字符集的查看及修改
- HTTPS + Tomcat搭建完整步骤
- 相对路径和绝对路径的区别
- LintCode: Median of two Sorted Arrays
- PostgreSQL-PL/pgSQL-cursor,loop
- 实习(-):服务器环境配置
- 个人学习Java的真实经验
- 仿QQ修改密码后弹出对话框(Jpush推送下实现)
- JDK动态代理中关于InvocationHandler中invoke()方法的调用问题
- #VSTS 日志# TFS 2015 Update 1 发布 – Git和TFVC代码库可以混合使用了
- UE4组件
- Mysql文件太大导入失败解决办法总结
- DNS设置及常用DNS服务器地址
- 域名301跳转
- 网站开发进阶(二十三)Address already in use: JVM_Bind <null>:8088
- 开发――顶级开发者社区网站
- 网站开发进阶(二十三)Address already in use: JVM_Bind <null>:8088
- IOS中一段文字设置多种字体颜色代码
- [EmguCV][000] 基于C#搭建 Emgu CV 开发环境