作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
原型模式
定义
如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式(Prototype Design Pattern),简称原型模式。
类图
实现
1. 浅拷贝
@Data
public class SearchWords implements Cloneable{
String keyWorld;
long updateTimeStamp;
long lastUpdateTime;
ReferenceClass referenceClass;
public SearchWords(String keyWorld, long lastUpdateTime) {
this.keyWorld = keyWorld;
this.lastUpdateTime = lastUpdateTime;
}
@Override
protected SearchWords clone() throws CloneNotSupportedException {
SearchWords content = null;
try {
content = (SearchWords)super.clone();
} catch (Exception e) {
e.printStackTrace();
}
return content;
}
@Override
public String toString() {
return "SearchContent{" +
"keyWorld='" + keyWorld + '\'' +
", updateTimeStamp=" + updateTimeStamp +
'}';
}
}
2. 深拷贝
public Object deepCopy(Object object) throws Exception{
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(bo);
objectOutputStream.writeObject(object);
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return oi.readObject();
}
总结
浅拷贝
和深拷贝
的区别在于:浅拷贝
只会复制的索引,不会复制数据本身。相反,深拷贝
不仅会复制索引
,还会复制数据本身
。浅拷贝得到的对象和原始对象共享数据
,而深拷贝得到的是一份独立的对象
。- 如果要拷贝的对象是不可变对象,浅拷贝共享不可变对象是没问题的,但对于可变对象来说,浅拷贝得到的对象和原始对象会共享部分数据,就有可能出现数据被修改的风险,也就变得复杂多了