博客
关于我
Java浅拷贝和深拷贝的区别和原因
阅读量:664 次
发布时间:2019-03-16

本文共 1247 字,大约阅读时间需要 4 分钟。

Java对象内存管理浅拷贝和深拷贝的区别解析

在Java中,对象内存管理遵循重要的原则:除非明确调用new String().clone()system.arraycopy()等现实新建内存的方法,否则引用默认情况下指向的内容并不占用额外空间。这种机制在空间利用方面具有优势,但同时带来安全性挑战。假设一个银行的客户端变量与银行的内部数据库直接关联,若客户端被修改,数据库自然会受到影响。

###浅拷贝与深拷贝对比

####浅拷贝

  • 实现方式:如直接将外部数组赋值给对象的字段,采用this.sc = sc;这种方式。
  • 安全性:外部数组修改会直接反映到对象内部数据。
  • 示例
    String s1 = "Cui pf";String s2 = new String(new char[]{'C','u','i',' ','p','f'});System.out.println(s1==s2);  //输出false,反映地址不同System.out.println(s1.equals(s2)); //输出true,反映内容相同(浅拷贝)
  • 数组示例
    int[] score = {10, 100, 40, 80};Score sc = new Score(score);sc.printSc(); //输出[10, 100, 40, 80]  score[2] = 89;sc.printSc(); //输出[10, 100, 89, 80]

####深拷贝

  • 实现方式:使用clone()方法或手动复制每个元素,确保对象的独立性。
  • 安全性:外部变量修改不会影响对象内部数据。
  • 示例
    String s1 = "Cui pf";String s2 = new String(new char[]{'C','u','i',' ','p','f'});System.out.println(s1==s2); //输出false,反映地址不同System.out.println(s1.equals(s2)); //输出true,反映内容相同(深拷贝)
  • 数组示例
    int score[] = new int[]{10, 100, 40, 80};Score sc = new Score(score);sc.printSc(); //输出[10, 100, 40, 80]

    由于采用了深拷贝,sc中存储的数组与外部score数组没有关联,因此改变外部数组不会影响sc内部数据。

###注意事项

  • 当业务数据涉及敏感操作(如金融系统中的金额变更),必须使用深拷贝确保数据安全。
  • 使用new.clone()Arrays.copyOf()等明确方法创建新对象。
  • 数据类字段赋值时,避免直接将外部引用传递,改用深拷贝方式确保安全。

###总结理解浅拷贝和深拷贝的区别对于Java编程至关重要。正确的做法取决于具体需求,既要保证开发效率,又要确保系统安全。请根据业务场景合理选择,避免因粗心导致安全漏洞。

转载地址:http://xuvqz.baihongyu.com/

你可能感兴趣的文章
wx.NET CLI wrapper for wxWidgets
查看>>
Silverlight for linux 和 DLR(Dynamic Language Runtime)
查看>>
ASP.NET MVC Action Filters
查看>>
Powershell中禁止执行脚本解决办法
查看>>
OO_Unit2 多线程电梯总结
查看>>
git clone 出现fatal: unable to access ‘https://github 错误解决方法
查看>>
04_Mysql配置文件(重要参数)
查看>>
python 加密算法及其相关模块的学习(hashlib,RSA,random,string,math)
查看>>
JavaSE总结
查看>>
Python IO编程
查看>>
CSS入门总结
查看>>
使用 TortoiseGit 时,报 Access denied 错误
查看>>
基于 HTML5 WebGL 的污水处理厂泵站自控系统
查看>>
django-表单之模型表单渲染(六)
查看>>
c++之程序流程控制
查看>>
spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
查看>>
有道云笔记 同步到我的博客园
查看>>
李笑来必读书籍整理
查看>>
Hadoop(十六)之使用Combiner优化MapReduce
查看>>
《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
查看>>