网站首页 > java教程 正文
- 浅拷贝(Shallow Copy):
创建一个新对象,这个对象有着原始对象的一些基本数据类型的字段的拷贝,但是引用类型字段深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种常见的对象复制方式,它们在Java中的实现原理如下: - 浅拷贝(Shallow Copy)
浅拷贝是指创建一个新对象,然后将原始对象的非静态字段复制到新对象中。如果字段是值类型,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象。因此,原始对象和新对象引用同一个对象。
在Java中,可以通过实现Cloneable接口并重写clone()方法来实现浅拷贝。例如:
public class Person implements Cloneable {
private String name;
private int age;
private Address address;
// 构造函数、getter和setter方法省略
@Override
public Person clone() {
try {
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
}
在上面的代码中,Person类实现了Cloneable接口并重写了clone()方法。在clone()方法中,调用了super.clone()方法来创建一个新对象,并将原始对象的非静态字段复制到新对象中。注意,Address类型的字段address只是复制了引用,而没有复制引用的对象。
- 深拷贝(Deep Copy)
深拷贝是指创建一个新对象,并将原始对象的所有字段都复制到新对象中。如果字段是值类型,则对该字段执行逐位复制。如果字段是引用类型,则复制引用的对象。因此,原始对象和新对象是完全独立的。
在Java中,深拷贝可以通过序列化(Serialization)来实现。具体实现步骤如下:
(1)让需要深拷贝的类实现Serializable接口;
(2)将原始对象写入到字节流中;
(3)从字节流中读取对象。
例如:
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private Address address;
// 构造函数、getter和setter方法省略
public Person deepCopy() {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = null;
ObjectInputStream objectInputStream = null;
try {
objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(this);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
objectInputStream = new ObjectInputStream(byteArrayInputStream);
return (Person) objectInputStream.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
return null;
} finally {
try {
if (objectOutputStream != null) {
objectOutputStream.close();
}
if (objectInputStream != null) {
objectInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
在上面的代码中,Person类实现了Serializable接口,并实现了deepCopy()方法来进行深拷贝。在deepCopy()方法中,首先将原始对象写入到字节流中,然后从字节流中读取对象并返回。注意,Address类型的字段address也被复制了一份,因此原始对象和新对象是完全独立的。
猜你喜欢
- 2024-10-19 Python 中赋值、浅拷贝、深拷贝的区别是什么?
- 2024-10-19 Java 对象拷贝原理剖析(java 对象拷贝原理剖析)
- 2024-10-19 认识Object类和深浅拷贝!(阐述object.assign的用法,深拷贝与浅拷贝的区别?)
- 2024-10-19 三面“有赞”Java岗斩获offer:Spring+JVM+并发锁+分布式+算法
- 2024-10-19 谈谈 Java 开发中的对象拷贝(java对象拷贝工具类)
- 2024-10-19 深入浅出Java中的clone克隆方法,写得也太棒了
- 2024-10-19 深拷贝和浅拷贝之list、dataframe
- 2024-10-19 对象拷贝java 浅谈(java对象的拷贝)
- 2024-10-19 Java克隆对象需要知道的事(java克隆的作用)
- 2024-10-19 Java的Object十二个常用方法,你用过几个?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)