導航:首頁 > 編程語言 > java集合深度復制

java集合深度復制

發布時間:2025-06-16 06:32:33

1. java關於 克隆介面cloneable問題

對於你的例子中,屬性whenBuilt才是對象,因此可以簡單的修改一下clone方法即可
/** Override the protected clone method defined in the Object
class, and strengthen its accessibility */
public Object clone() {
try {
House t = (House)super.clone();
t.whenBuilt = (Date) this.whenBuilt.clone();
return t;
}
catch (CloneNotSupportedException ex) {
return null;
}
}
對於復雜的,可以利用串列化進行深度復制,下面的完整實例中的deepClone就是相應的代碼(此時,House類需要實現序列化的介面:java.io.Serializable)
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;

public class House implements Cloneable, Serializable{
private int id;
private double area;
private java.util.Date whenBuilt;

public House(int id, double area) {
this.id = id;
this.area = area;
whenBuilt = new java.util.Date();
}

public double getId() {
return id;
}

public double getArea() {
return area;
}

public java.util.Date getWhenBuilt() {
return whenBuilt;
}

/** Override the protected clone method defined in the Object
class, and strengthen its accessibility */
public Object clone() {
try {
House t = (House)super.clone();
t.whenBuilt = (Date) this.whenBuilt.clone();
return t;
}
catch (CloneNotSupportedException ex) {
return null;
}
}
public Object deepClone() {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ObjectOutputStream oo = new ObjectOutputStream(out);
oo.writeObject(this);

ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
ObjectInputStream oi = new ObjectInputStream(in);
return oi.readObject();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}

public static void main(String[] args) {
House house1 = new House(1,1750.50);
House house2 = (House)house1.deepClone();
System.out.println(house1.whenBuilt == house2.whenBuilt );
}
}

2. java如何深度一個object

java深復制的例子:
1、創建Employer類,實現Cloneable介面:
class Employer implements Cloneable{
private String username;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

2、創建Employee類,實現Cloneable介面,並改寫clone方法,實現深復制:
class Employee implements Cloneable{
private String username;
private Employer employer;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Employer getEmployer() {
return employer;
}
public void setEmployer(Employer employer) {
this.employer = employer;
}

@Override
public Object clone() throws CloneNotSupportedException {
//克隆Employee對象並手動的進一步克隆Employee對象中包含的Employer對象
Employee employee = (Employee)super.clone();
employee.setEmployer((Employer) employee.getEmployer().clone());
return employee;
}
}

3、這樣,在客戶端拷貝的兩個Employee對象的Employer就互不影響了:
public static void main(String[] args) throws CloneNotSupportedException {
Employer employer = new Employer();
employer.setUsername("arthinking");

Employee employee = new Employee();
employee.setUsername("Jason");
employee.setEmployer(employer);

//employee2由employee深復製得到
Employee employee2 = (Employee) employee.clone();
//這樣兩個employee各自保存了兩個employer
employee2.getEmployer().setUsername("Jason");
System.out.println(employee.getEmployer().getUsername());
System.out.println(employee2.getEmployer().getUsername());
}

閱讀全文

與java集合深度復制相關的資料

熱點內容
想學車床編程買什麼書 瀏覽:949
d盤多出文件夾是什麼原因 瀏覽:585
如何聯系網路游戲運營平台 瀏覽:291
列印機掃描成pdf文件需要下載什麼軟體 瀏覽:592
小米2s看安卓版本 瀏覽:508
ps保存的源文件是白色的 瀏覽:567
文件ps入門教程零基礎 瀏覽:331
抽桿文件夾最多夾多少張 瀏覽:369
導入許可證注冊文件是什麼意思 瀏覽:71
怎麼在手機上建立文件夾 瀏覽:499
php用戶注冊php用戶登錄代碼 瀏覽:190
w10系統怎麼發離線文件 瀏覽:731
cad樣式文件夾 瀏覽:419
聯想無線網路安裝驅動下載 瀏覽:216
怎麼讓電腦顯示隱藏文件 瀏覽:254
如何刪除xp的帳號密碼 瀏覽:182
linux一般安裝在哪個文件夾 瀏覽:84
wap文件怎麼沒有顯示0 瀏覽:126
匯編程序的流程圖怎麼畫 瀏覽:642
手機excel文件怎麼寫字 瀏覽:476

友情鏈接