电子商务网站开发课程简介上海房地产网站官网

张小明 2025/12/31 1:06:22
电子商务网站开发课程简介,上海房地产网站官网,怎样做网站背景,网站的关键词报价的网站文章目录前言一、 前置知识#xff1a;Java 的数据类型与对象存储二、 浅拷贝#xff08;Shallow Copy#xff09;#xff1a;只拷贝 “表面”1. 浅拷贝的定义2. 浅拷贝的实现方式3. 浅拷贝的核心特点三、 深拷贝#xff08;Deep Copy#xff09;#xff1a;拷贝 “完全…文章目录前言一、 前置知识Java 的数据类型与对象存储二、 浅拷贝Shallow Copy只拷贝 “表面”1. 浅拷贝的定义2. 浅拷贝的实现方式3. 浅拷贝的核心特点三、 深拷贝Deep Copy拷贝 “完全独立” 的对象1. 深拷贝的定义2. 深拷贝的两种实现方式3. 深拷贝的核心特点四、 浅拷贝 vs 深拷贝核心区别对比五、 开发中的避坑指南六、 总结前言大家好我是程序员梁白开今天我们聊一聊Java 深拷贝与浅拷贝。在 Java 开发中对象复制是高频操作。你是否遇到过 “修改新对象原对象也跟着变” 的诡异情况是否在clone()方法上踩过无数坑这些问题的根源都在于没分清浅拷贝Shallow Copy和深拷贝Deep Copy的本质区别一、 前置知识Java 的数据类型与对象存储要搞懂深浅拷贝必须先明白 Java 中数据的存储逻辑这是一切的基础Java 中的数据类型分为两类基本数据类型byte、short、int、long、float、double、char、boolean存储位置直接存储在栈内存中变量保存的是值本身。赋值逻辑赋值时直接拷贝值新旧变量互不影响。引用数据类型类、接口、数组存储位置对象本身存在堆内存变量保存的是堆内存的地址引用。赋值逻辑赋值时拷贝的是地址引用新旧变量指向同一个堆内存对象。举个简单的赋值例子// 基本数据类型赋值inta10;intba;b20;System.out.println(a);// 输出10a不受b影响// 引用数据类型赋值Useruser1newUser(张三,20);Useruser2user1;// 拷贝的是引用地址user2.setName(李四);System.out.println(user1.getName());// 输出李四原对象被修改二、 浅拷贝Shallow Copy只拷贝 “表面”1. 浅拷贝的定义浅拷贝是指创建一个新对象新对象的基本数据类型成员变量会拷贝原对象的值但引用数据类型成员变量拷贝的是原对象的地址引用。简单说浅拷贝只拷贝 “第一层”引用类型成员变量还是共用同一个堆对象。2. 浅拷贝的实现方式Java 中实现浅拷贝有两种常见方式方式 1手动 new 对象逐个赋值方式 2实现Cloneable接口重写clone()方法默认浅拷贝、方式 1手动浅拷贝手动创建新对象将原对象的成员变量逐个赋值引用类型变量直接赋值地址。// 用户类classUser{privateStringname;// 引用类型privateintage;// 基本类型// 构造器、getter、setter省略}// 手动浅拷贝publicclassShallowCopyDemo{publicstaticvoidmain(String[]args){Useruser1newUser(张三,20);// 手动浅拷贝Useruser2newUser();user2.setName(user1.getName());user2.setAge(user1.getAge());// 修改基本类型user2.setAge(25);System.out.println(user1.getAge());// 输出20不受影响// 修改引用类型String是不可变类这里换个例子更直观// 我们换一个自定义引用类型成员变量演示比如给User加一个Address属性}}方式 2实现Cloneable接口推荐Java 中Object类提供了clone()方法但它是protected修饰的且默认是浅拷贝。要使用该方法需要实现Cloneable标记接口没有任何方法仅作标记重写clone()方法修改访问权限为public我们给User类增加一个引用类型成员变量Address更直观地看浅拷贝的问题// 地址类引用类型classAddress{privateStringcity;// 构造器、getter、setter省略publicAddress(Stringcity){this.citycity;}}// 用户类实现Cloneable接口classUserimplementsCloneable{privateStringname;// 引用类型privateintage;// 基本类型privateAddressaddr;// 自定义引用类型// 构造器、getter、setter省略publicUser(Stringname,intage,Addressaddr){this.namename;this.ageage;this.addraddr;}// 重写clone方法默认浅拷贝OverridepublicObjectclone()throwsCloneNotSupportedException{returnsuper.clone();}}// 测试浅拷贝publicclassShallowCopyTest{publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{AddressaddrnewAddress(北京);Useruser1newUser(张三,20,addr);// 浅拷贝Useruser2(User)user1.clone();// 1. 修改基本类型成员变量user2.setAge(25);System.out.println(user1.getAge());// 输出20不受影响// 2. 修改引用类型成员变量核心坑点user2.getAddr().setCity(上海);System.out.println(user1.getAddr().getCity());// 输出上海原对象被修改}}3. 浅拷贝的核心特点优点实现简单拷贝效率高。缺点引用类型成员变量共享堆内存修改新对象的引用成员会影响原对象存在数据安全风险。三、 深拷贝Deep Copy拷贝 “完全独立” 的对象1. 深拷贝的定义深拷贝是指创建一个新对象不仅拷贝原对象的基本数据类型成员变量值还会为引用数据类型成员变量重新创建一个独立的新对象。简单说深拷贝会拷贝 “所有层级”新对象和原对象完全独立修改任何一方都不会影响另一方。2. 深拷贝的两种实现方式深拷贝的实现比浅拷贝复杂常见的有两种方式方式 1嵌套重写clone()方法适用于自定义类较少的场景方式 2序列化与反序列化通用推荐适用于复杂对象方式 1嵌套重写clone()方法思路不仅要让外层类实现Cloneable其所有引用类型成员变量对应的类也需要实现Cloneable并重写clone()方法然后在外层类的clone()方法中手动拷贝引用成员。// 地址类实现Cloneable接口classAddressimplementsCloneable{privateStringcity;publicAddress(Stringcity){this.citycity;}// getter、setter省略// 地址类重写clone方法OverridepublicObjectclone()throwsCloneNotSupportedException{returnsuper.clone();}}// 用户类classUserimplementsCloneable{privateStringname;privateintage;privateAddressaddr;// 构造器、getter、setter省略// 重写clone方法实现深拷贝OverridepublicObjectclone()throwsCloneNotSupportedException{// 1. 先拷贝外层对象浅拷贝Useruser(User)super.clone();// 2. 再手动拷贝引用类型成员变量关键步骤user.addr(Address)this.addr.clone();returnuser;}}// 测试深拷贝publicclassDeepCopyTest{publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{AddressaddrnewAddress(北京);Useruser1newUser(张三,20,addr);Useruser2(User)user1.clone();// 修改新对象的引用成员变量user2.getAddr().setCity(上海);// 原对象不受影响System.out.println(user1.getAddr().getCity());// 输出北京}}方式 2序列化与反序列化推荐思路将对象序列化为字节流再从字节流反序列化为新对象这个过程会自动创建一个完全独立的新对象。注意所有涉及的类都需要实现Serializable标记接口否则会抛出序列化异常。importjava.io.*;// 地址类实现SerializableclassAddressimplementsSerializable{privatestaticfinallongserialVersionUID1L;// 序列化版本号privateStringcity;// 构造器、getter、setter省略}// 用户类实现SerializableclassUserimplementsSerializable{privatestaticfinallongserialVersionUID1L;privateStringname;privateintage;privateAddressaddr;// 构造器、getter、setter省略// 深拷贝工具方法publicUserdeepCopy()throwsIOException,ClassNotFoundException{// 1. 序列化将对象写入字节流ByteArrayOutputStreambosnewByteArrayOutputStream();ObjectOutputStreamoosnewObjectOutputStream(bos);oos.writeObject(this);// 2. 反序列化从字节流读取新对象ByteArrayInputStreambisnewByteArrayInputStream(bos.toByteArray());ObjectInputStreamoisnewObjectInputStream(bis);return(User)ois.readObject();}}// 测试序列化深拷贝publicclassDeepCopyBySerialize{publicstaticvoidmain(String[]args)throwsException{AddressaddrnewAddress(北京);Useruser1newUser(张三,20,addr);Useruser2user1.deepCopy();user2.getAddr().setCity(上海);System.out.println(user1.getAddr().getCity());// 输出北京完全独立}}3. 深拷贝的核心特点优点新对象与原对象完全隔离数据安全不存在相互影响的问题。缺点实现相对复杂序列化方式会有一定的性能开销。四、 浅拷贝 vs 深拷贝核心区别对比为了方便大家记忆我们用一张表格总结两者的核心区别特性浅拷贝深拷贝拷贝层级仅拷贝第一层基本类型值 引用地址拷贝所有层级基本类型值 引用对象新实例引用成员变量与原对象共享同一个引用对象重新创建独立的引用对象修改影响修改新对象的引用成员会影响原对象修改新对象完全不影响原对象实现难度简单手动赋值或重写 clone () 即可较复杂嵌套 clone 或序列化性能效率高开销小效率较低序列化有额外开销适用场景对象无引用类型成员或无需独立引用成员对象包含多层引用类型需要完全独立的拷贝五、 开发中的避坑指南不要滥用clone()方法默认是浅拷贝一定要检查引用成员变量是否会导致数据安全问题。序列化深拷贝注意事项所有相关类必须实现Serializable接口。静态变量不会被序列化因为静态变量属于类不属于对象。transient修饰的变量不会被序列化可用于排除不需要拷贝的敏感字段。不可变类的特殊情况比如String、Integer等不可变类因为其值不可修改即使是浅拷贝也不会出现数据联动问题。六、 总结直接赋值≠拷贝引用类型赋值只是传递地址新旧变量指向同一对象。浅拷贝只拷贝第一层引用成员共享适合简单对象。深拷贝拷贝所有层级对象完全独立适合复杂嵌套对象。选择哪种拷贝方式核心看业务需求如果只是临时使用且不需要修改引用成员浅拷贝足够如果需要长期存储或修改数据一定要用深拷贝保证数据安全
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站开发如何适应各分辨率优化大师的优化项目有哪7个

数据获取与命令行工具的创建与使用 一、数据获取方法 1.1 从关系数据库获取数据 可以使用命令行工具 sql2csv 从关系数据库中获取数据。 sql2csv 是 Csvkit 套件的一部分,它借助 Python 的 SQLAlchemy 包,能在多种不同的数据库(如 MySQL、Oracle、PostgreSQL、SQLite…

张小明 2025/12/28 0:05:23 网站建设

做动画 的 网站网站建设和注册

HTML模板元素&#xff1a;<template>标签与现代前端开发 在Web开发领域&#xff0c;HTML作为构建网页的基础语言&#xff0c;始终在持续进化。HTML5引入的<template>标签为前端开发带来了革命性变化&#xff0c;它通过惰性渲染机制和DOM操作优化&#xff0c;重新定…

张小明 2025/12/28 0:07:49 网站建设

大学教学应用网站开发现状网站建设方案2018

5步精通mo.js&#xff1a;解决网页动画开发中的核心痛点 【免费下载链接】mojs The motion graphics toolbelt for the web 项目地址: https://gitcode.com/gh_mirrors/mo/mojs mo.js作为专业的网页运动图形工具库&#xff0c;为开发者提供了完整的动画解决方案。无论你…

张小明 2025/12/28 1:36:28 网站建设

广东监理建设协会网站网站的设计需要什么

LangFlow节能模式&#xff1a;如何让AI开发更安静、更清凉、更绿色 在一间堆满设备的开发者实验室里&#xff0c;你是否经历过这样的场景&#xff1f;一台搭载RTX 3080的工作站正嗡嗡作响&#xff0c;风扇高速旋转&#xff0c;机箱烫得几乎不能碰——而屏幕前的人只是在编辑一个…

张小明 2025/12/28 3:04:00 网站建设

哪个网站做学历认证搜索引擎关键词优化

FPGA技术:从系数编码到高级综合工具 1. FPGA系数编码与乘法器技术 在FPGA设计中,Xilinx Virtex - II系列所展示的只是一小部分示例。完整的单元范围取决于查找表(LUT)输入数量和专用硬件资源。下一步是对系数进行编码,以确定最有效的结构,即有符号数字(SD)编码。系数…

张小明 2025/12/28 3:45:19 网站建设

简单的seo网站优化排名计算机培训班有哪些

核心作用&#xff1a;Spring 提供的注解&#xff0c;标注在类或方法上&#xff0c;使方法在异步线程中执行&#xff0c;调用者无需等待方法完成即可继续执行后续逻辑。使用两步走&#xff1a;启动类添加 EnableAsync&#xff0c;开启异步任务支持&#xff1b;需异步执行的方法 …

张小明 2025/12/28 4:54:57 网站建设