中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

Java的深拷貝與淺拷貝怎么使用

小億
88
2023-08-17 23:39:11
欄目: 編程語言

在Java中,對象的拷貝分為淺拷貝和深拷貝兩種方式。

淺拷貝是指創建一個新的對象,然后將原對象的非靜態字段值復制到新對象中。新對象和原對象的引用類型字段將指向相同的對象。可以通過實現Cloneable接口并重寫clone()方法來實現淺拷貝。

深拷貝是指創建一個新的對象,然后將原對象的非靜態字段值復制到新對象中。新對象和原對象的引用類型字段也將被復制,即引用類型字段指向的對象也會被復制。可以通過實現Serializable接口,將對象序列化為字節流,然后再反序列化為新對象來實現深拷貝。

下面是兩種拷貝方式的示例代碼:

  1. 淺拷貝示例:
class Person implements Cloneable {
private String name;
private int age;
private Address address;
// 省略構造方法和getter/setter
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Address {
private String city;
private String street;
// 省略構造方法和getter/setter
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("Beijing", "Dongcheng");
Person person1 = new Person("Alice", 25, address);
Person person2 = (Person) person1.clone();
System.out.println(person1 == person2); // false
System.out.println(person1.getAddress() == person2.getAddress()); // true
}
}
  1. 深拷貝示例:
import java.io.*;
class Person implements Serializable {
private String name;
private int age;
private Address address;
// 省略構造方法和getter/setter
public Person deepCopy() throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (Person) ois.readObject();
}
}
class Address implements Serializable {
private String city;
private String street;
// 省略構造方法和getter/setter
}
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Address address = new Address("Beijing", "Dongcheng");
Person person1 = new Person("Alice", 25, address);
Person person2 = person1.deepCopy();
System.out.println(person1 == person2); // false
System.out.println(person1.getAddress() == person2.getAddress()); // false
}
}

需要注意的是,深拷貝要求被拷貝的對象及其引用類型字段都必須實現Serializable接口。如果對象的某個引用類型字段沒有實現Serializable接口,那么拷貝將會失敗。

0
微山县| 肃宁县| 乐昌市| 辽宁省| 汤阴县| 龙门县| 安庆市| 忻州市| 米易县| 茂名市| 卢龙县| 井研县| 山西省| 四会市| 彭阳县| 虎林市| 福鼎市| 晋州市| 新巴尔虎右旗| 高淳县| 津市市| 镇宁| 清原| 瑞丽市| 客服| 沁源县| 南皮县| 龙泉市| 佳木斯市| 东莞市| 炎陵县| 平阴县| 通辽市| 昌平区| 竹溪县| 绍兴县| 新竹市| 田林县| 静乐县| 东源县| 镇安县|