当前位置: 首页 > news >正文

找生意做那个网站靠谱友情链接管理系统

找生意做那个网站靠谱,友情链接管理系统,wordpress url映射,建设网站对于客户在软件开发中,克隆对象是一个常见需求。克隆的方式主要有两种:深克隆(Deep Clone)和浅克隆(Shallow Clone)。了解它们的区别及其实现方法,对于编写高效、安全的代码非常重要。 深克隆与浅克隆的…

在软件开发中,克隆对象是一个常见需求。克隆的方式主要有两种:深克隆(Deep Clone)和浅克隆(Shallow Clone)。了解它们的区别及其实现方法,对于编写高效、安全的代码非常重要。

深克隆与浅克隆的区别

浅克隆(Shallow Clone)
浅克隆会复制原型对象的基本数据类型的字段(如int, float等),而对于引用类型的字段(如对象、数组等),只会复制其引用地址。也就是说,原型对象和克隆对象会共享引用类型的字段。

深克隆(Deep Clone)
深克隆不仅复制原型对象的基本数据类型字段,还会递归复制引用类型的字段。这样,原型对象和克隆对象在内存中是完全独立的,不会共享任何引用类型的字段。

如何实现深克隆?

深克隆的实现方式有多种,下面介绍三种常见的方法:

  1. 所有对象都实现克隆方法
  2. 通过构造方法实现深克隆
  3. 使用 JDK 自带的字节流实现深克隆
所有对象都实现克隆方法

这种方式要求所有引用类型的对象都实现Cloneable接口,并重写clone方法。例如:

public class CloneExample {public static void main(String[] args) throws CloneNotSupportedException {// 创建被赋值对象Address address = new Address(001, "北京");People p1 = new People(1, "Java", address);// 克隆 p1 对象People p2 = p1.clone();// 修改原型对象p1.getAddress().setCity("上海");// 输出 p1 和 p2 地址信息System.out.println("p1:" + p1.getAddress().getCity() + " p2:" + p2.getAddress().getCity());}static class People implements Cloneable {private Integer id;private String name;private Address address;@Overrideprotected People clone() throws CloneNotSupportedException {People people = (People) super.clone();people.setAddress(this.address.clone()); // 引用类型克隆赋值return people;}// getter 和 setter 方法public People(Integer id, String name, Address address) {this.id = id;this.name = name;this.address = address;}}static class Address implements Cloneable {private Integer id;private String city;@Overrideprotected Address clone() throws CloneNotSupportedException {return (Address) super.clone();}// getter 和 setter 方法public Address(Integer id, String city) {this.id = id;this.city = city;}}
}
通过构造方法实现深克隆

《Effective Java》中推荐使用构造器来实现深克隆。构造器的参数为基本数据类型或字符串类型时直接赋值,如果是对象类型,则需要重新创建一个新的对象。

public class SecondExample {public static void main(String[] args) {// 创建对象Address address = new Address(001, "北京");People p1 = new People(1, "Java", address);// 调用构造函数克隆对象People p2 = new People(p1.getId(), p1.getName(), new Address(p1.getAddress().getId(), p1.getAddress().getCity()));// 修改原型对象p1.getAddress().setCity("上海");// 输出 p1 和 p2 地址信息System.out.println("p1:" + p1.getAddress().getCity() + " p2:" + p2.getAddress().getCity());}static class People {private Integer id;private String name;private Address address;// getter 和 setter 方法public People(Integer id, String name, Address address) {this.id = id;this.name = name;this.address = address;}}static class Address {private Integer id;private String city;// getter 和 setter 方法public Address(Integer id, String city) {this.id = id;this.city = city;}}
}
使用 JDK 自带的字节流实现深克隆

通过字节流实现深克隆的方式是将原型对象写入到内存中的字节流,然后再从这个字节流中读出信息,生成一个新对象。这个新对象与原型对象在内存地址上是完全独立的。

import java.io.*;public class ThirdExample {public static void main(String[] args) {// 创建对象Address address = new Address(001, "北京");People p1 = new People(1, "Java", address);// 通过字节流实现克隆People p2 = (People) StreamClone.clone(p1);// 修改原型对象p1.getAddress().setCity("上海");// 输出 p1 和 p2 地址信息System.out.println("p1:" + p1.getAddress().getCity() + " p2:" + p2.getAddress().getCity());}static class StreamClone {public static <T extends Serializable> T clone(People obj) {T cloneObj = null;try {// 写入字节流ByteArrayOutputStream bo = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bo);oos.writeObject(obj);oos.close();// 分配内存, 写入原始对象, 生成新对象ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());ObjectInputStream oi = new ObjectInputStream(bi);// 返回生成的新对象cloneObj = (T) oi.readObject();oi.close();} catch (Exception e) {e.printStackTrace();}return cloneObj;}}static class People implements Serializable {private Integer id;private String name;private Address address;// getter 和 setter 方法public People(Integer id, String name, Address address) {this.id = id;this.name = name;this.address = address;}}static class Address implements Serializable {private Integer id;private String city;// getter 和 setter 方法public Address(Integer id, String city) {this.id = id;this.city = city;}}
}

需要注意的是,由于通过字节流序列化实现的深克隆,每个对象必须实现Serializable接口,否则会抛出异常。

总结

深克隆和浅克隆在对象复制上的区别主要在于是否复制引用类型的对象。浅克隆仅复制对象本身,而深克隆会递归复制所有引用类型的对象。根据需求的不同,可以选择实现Cloneable接口、使用构造器或者通过字节流进行深克隆。了解这些实现方法,可以帮助我们在开发过程中更好地管理对象的复制和内存的使用。

http://www.mmbaike.com/news/55328.html

相关文章:

  • 怎么做网站卖机床中视频自媒体账号注册下载
  • 做视频网站用什么语言河南seo技术教程
  • 宝安龙华积分商城网站建设电商网站上信息资源的特点包括
  • 企业做网站的费用百度网站ip地址
  • typecho wordpress关键词优化案例
  • 政府门户网站建设情况工作汇报seo站长工具推广平台
  • 帮网站做诚信证书可靠吗楚雄seo
  • cdr做网站流程百度排名规则
  • 政府网站制作建设十大免费引流平台
  • 做滤芯的网站站长之家ip查询工具
  • 直播网站开发平台网站的推广方法有哪些
  • 带有flash的网站磁力神器
  • 织梦cms做网站流程网络推广包括哪些
  • 网站每个页面关键词都一样网络宣传推广方案
  • 上海官方网站建龙岗网站设计
  • 阿里巴巴批发网站叫什么如何制作一个宣传网页
  • 广东智能网站建设配件网络营销类型
  • wordpress取分类名称搜索引擎优化seo网站
  • 网站建设建站经验百度网盘网页版
  • 素材网站的图可以做海报吗界首网站优化公司
  • 用竹片做的网站今天的新闻
  • 网站优化是在哪里做修改网站建站哪家公司好
  • 广告设计制作公司经营范围seo深圳网络推广
  • 网站和微信seo网站监测
  • 常德网站建设优化网络营销师有前途吗
  • 青岛网站制作永诚百度网盘服务电话6988
  • 做相册集什么网站好的seo平台
  • 网站遭攻击网推广公司
  • 深圳网站搜索引擎优化网络推广优化网站
  • 网站 后台 回车不了开发网站的流程是