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

网站建设考核表周口seo公司

网站建设考核表,周口seo公司,手机网站模板 html5,上海网站开发建浅拷贝 浅拷贝会创建一个新的对象,复制该对象的基本类型引用,但不复制该对象内的其他对象引用。一个对象要支持浅拷贝,需要实现Cloneable接口,不然在调用clone()方法时会抛出异常 protected Object clone() throws CloneNotSuppo…

浅拷贝

浅拷贝会创建一个新的对象,复制该对象的基本类型引用,但不复制该对象内的其他对象引用。一个对象要支持浅拷贝,需要实现Cloneable接口,不然在调用clone()方法时会抛出异常

    protected Object clone() throws CloneNotSupportedException {if (!(this instanceof Cloneable)) {throw new CloneNotSupportedException("Class " + getClass().getName() +" doesn't implement Cloneable");}return internalClone();}

看个简单的demo

public class ShallowCopy implements Cloneable {int i = 10;String str = "ShallowCopy";Shallow shallow = new Shallow();public static class Shallow {String shallow = "shallow";}public static void testShallowCopy() {ShallowCopy shallowCopy = new ShallowCopy();try {ShallowCopy shallowCopyClone = (ShallowCopy) shallowCopy.clone();LogUtil.info("ShallowCopy", "(shallowCopy == shallowCopyClone) = " + (shallowCopy == shallowCopyClone));LogUtil.info("ShallowCopy", "(shallowCopy.equals(shallowCopyClone)) = " + (shallowCopy.equals(shallowCopyClone)));LogUtil.info("ShallowCopy", "(shallowCopy.shallow == shallowCopyClone.shallow) = " + (shallowCopy.shallow == shallowCopyClone.shallow));LogUtil.info("ShallowCopy", "(shallowCopy.shallow.equals(shallowCopyClone.shallow)) = " + (shallowCopy.shallow.equals(shallowCopyClone.shallow)));} catch (CloneNotSupportedException e) {throw new RuntimeException(e);}}
}

打印结果如下

2025-03-13 16:53:25.564   (shallowCopy == shallowCopyClone) = false
2025-03-13 16:53:25.564   (shallowCopy.equals(shallowCopyClone)) = false
2025-03-13 16:53:25.564   (shallowCopy.shallow == shallowCopyClone.shallow) = true
2025-03-13 16:53:25.564   (shallowCopy.shallow.equals(shallowCopyClone.shallow)) = true

我们发现shallowCopyshallowCopyClone指向不同的对象,但是里面的shallow却是同一个。如果要实现两个shallowCopyshallowCopyClone两个完全不同的对象,也即是要实现深拷贝,有两个办法,下文介绍两种方法

深拷贝

  1. 内部的对象引用所属类也继承clone接口,重写clone()方法,例如
public class ShallowCopy implements Cloneable {int i = 10;String str = "ShallowCopy";Shallow shallow = new Shallow();@NonNull@Overrideprotected Object clone() throws CloneNotSupportedException {ShallowCopy cloned = (ShallowCopy)super.clone();cloned.shallow = (Shallow)shallow.clone();return cloned;}public static class Shallow implements Cloneable {String shallow = "shallow";@NonNull@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}}public static void testShallowCopy() {ShallowCopy shallowCopy = new ShallowCopy();try {ShallowCopy shallowCopyClone = (ShallowCopy) shallowCopy.clone();LogUtil.info("ShallowCopy", "(shallowCopy == shallowCopyClone) = " + (shallowCopy == shallowCopyClone)); // falseLogUtil.info("ShallowCopy", "(shallowCopy.equals(shallowCopyClone)) = " + (shallowCopy.equals(shallowCopyClone))); // falseLogUtil.info("ShallowCopy", "(shallowCopy.shallow == shallowCopyClone.shallow) = " + (shallowCopy.shallow == shallowCopyClone.shallow)); // falseLogUtil.info("ShallowCopy", "(shallowCopy.shallow.equals(shallowCopyClone.shallow)) = " + (shallowCopy.shallow.equals(shallowCopyClone.shallow))); // false} catch (CloneNotSupportedException e) {throw new RuntimeException(e);}}
}

返回结果

2025-03-13 17:14:09.906   (shallowCopy == shallowCopyClone) = false
2025-03-13 17:14:09.906   (shallowCopy.equals(shallowCopyClone)) = false
2025-03-13 17:14:09.906   (shallowCopy.shallow == shallowCopyClone.shallow) = false
2025-03-13 17:14:09.906   (shallowCopy.shallow.equals(shallowCopyClone.shallow)) = false

但这个方法有个弊端,就是如果引用对象的链路比较深,例如 A 引用 B,B 引用 C,C 引用 D,甚至更深,就需要重写很多clone()方法,不易于维护.

值得注意的是Shallow类里面的shallow变量,它是一个String类型的对象引用,但是却可以不用实现clone接口实现深拷贝。原因是String是不可变的,修改String类型都会返回一个新对象,参考文档String 基础知识

  1. 使用Serializable序列化实现深拷贝

需要注意的是引用对象的类型也要实现Serializable接口,不然后报错

public class ShallowCopy implements Cloneable, Serializable {public static class Shallow implements Cloneable, Serializable {}
}

如果Shallow没有实现Serializable接口,则会出现java.io.NotSerializableException。接着使用IO实现序列化和反序列化

    public ShallowCopy deepClone() {ShallowCopy deepClone = null;try {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(this);ByteArrayInputStream bio = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bio);deepClone = (ShallowCopy) ois.readObject();} catch (IOException | ClassNotFoundException e) {throw new RuntimeException(e);}return deepClone;}

结果打印

    public static void testDeepCopy() {ShallowCopy shallowCopy = new ShallowCopy();ShallowCopy shallowCopyDeepClone = shallowCopy.deepClone();LogUtil.info("ShallowCopy", "(shallowCopy == shallowCopyDeepClone) = " + (shallowCopy == shallowCopyDeepClone)); // falseLogUtil.info("ShallowCopy", "(shallowCopy.equals(shallowCopyDeepClone)) = " + (shallowCopy.equals(shallowCopyDeepClone))); // falseLogUtil.info("ShallowCopy", "(shallowCopy.shallow == shallowCopyDeepClone.shallow) = " + (shallowCopy.shallow == shallowCopyDeepClone.shallow)); // falseLogUtil.info("ShallowCopy", "(shallowCopy.shallow.equals(shallowCopyDeepClone.shallow)) = " + (shallowCopy.shallow.equals(shallowCopyDeepClone.shallow))); // false}
http://www.dtcms.com/wzjs/379117.html

相关文章:

  • 成人大专学历怎么自考枫林seo工具
  • ecs 网站设计网站如何优化推广
  • 网站备案为什么 没有批复文件百度指数明星搜索排名
  • 绍兴网站建设百度推广客户端app
  • 做网站和维护网站营销网站建设培训学校
  • 网站建设具体实施方案网络服务器有哪些
  • 宁波正规优化seo公司seo监控系统
  • 自媒体横行还有做网站一个产品的网络营销方案
  • 帮人做网站百度知道小程序
  • 网站备案变更主体中国搜索引擎份额排行
  • 吉林省住房和城乡建设厅网站6搜索引擎哪个好
  • 网站建设 黑龙江微信管理软件哪个最好
  • 淮安软件园网站建设福州网站优化公司
  • 互助盘网站怎么做的seo网站优化技术
  • 深圳龙华区福城街道网站seo诊断工具
  • 做网站宝安百度竞价教程
  • cms开发框架seo视频教程我要自学网
  • 网站 前台 设计要求百度文库首页
  • 开一家公司需要具备什么条件网站优化策略分析
  • 网站功能说明怎么做电脑培训网上课程
  • 做校园网站的公司软文广告经典案例分析
  • 做外贸没有网站需要什么条件社群营销活动策划方案
  • 想学网店运营去哪里学啊网站推广seo招聘
  • 网站建设功能模块百度搜索一下百度
  • 给有后台的网站做网页手机怎么自己制作网页
  • 百度网址大全网址导航武汉seo关键词排名
  • 南川区 网站集约化建设方案seo短视频发布页
  • 建设网站总结报告合肥seo网站建设
  • .net网站开发实训企业宣传软文范例
  • 如何用电子邮箱做网站天津百度网站排名优化