博客
关于我
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/

你可能感兴趣的文章
1110 Complete Binary Tree (25 point(s))
查看>>
541【毕设课设】基于单片机电阻电感电容RLC测量仪系统
查看>>
568【毕设课设】基于单片机多路温度采集显示报警控制系统设计
查看>>
基于8086交通灯系统仿真设计(微机原理设计资料)
查看>>
解读域名管理之:域名注册机构介绍
查看>>
找中位数
查看>>
这些运维发展方向及系统运维技能都不了解,怎么能吃透Linux??
查看>>
自动化测试——UI自动化测试的痛点
查看>>
如何将萌推商品主图、属性图、详情图批量保存到电脑的方法
查看>>
2021年N1叉车司机模拟考试及N1叉车司机考试软件
查看>>
【奇淫巧技】Java动态代理(JDK和cglib)
查看>>
2021-05-11 现代操作系统 《现代操作系统 第4版》第3章 内存管理——总结(分段,分页,段页)(转载)
查看>>
MP4修改元数据日志记录
查看>>
WebView使用
查看>>
【Stimulsoft Reports.Net教程】使用DesignerFx
查看>>
Python | 02.下载视频(普通视频、m3u8加密视频ts)
查看>>
攻防世界 Pwn 新手
查看>>
mybtis-plus 出现 Wrong namespace
查看>>
理解JavaScript的临时包装对象
查看>>
2008年7月20日星期日
查看>>