深拷貝和淺拷貝

2022-06-06 22:30:14 字數 2427 閱讀 8864

深拷貝和淺拷貝的區別

淺拷貝(shallowcopy)只是增加了乙個指標指向已存在的記憶體位址,

深拷貝(deepcopy)是增加了乙個指標並且申請了乙個新的記憶體,使這個增加的指標指向這個新的記憶體,

使用深拷貝的情況下,釋放記憶體的時候不會因為出現淺拷貝時釋放同乙個記憶體的錯誤。

淺拷貝的實現

科目類

public class subject 

public string getname()

public void setname(string name)

@override

public string tostring()

}

學生類實現cloneable

public class student implements cloneable 

public void setsubject(subject subject)

public string getname()

public void setname(string name)

public int getage()

public void setage(int age)

/*** 重寫clone()方法

* @return

*/@override

public object clone() catch (clonenotsupportedexception e)

}@override

public string tostring()

}

使用方法

public class shallowcopy 

}

輸出的結果:

studenta:[student: 460141958,subject:[subject: 1163157884,name:lishi],name:lynn,age:20]

studentb:[student: 1956725890,subject:[subject: 1163157884,name:lishi],name:lily,age:18]

由輸出的結果可見,通過 studenta.clone() 拷貝物件後得到的 studentb,和 studenta 是兩個不同的物件。studenta 和 studentb 的基礎資料型別的修改互不影響,而引用型別 subject 修改後是會有影響的。

深拷貝科目類也實現cloneable

public class subject implements cloneable 

public string getname()

public void setname(string name)

@override

protected object clone() throws clonenotsupportedexception

@override

public string tostring()

}

在 student 的 clone() 方法中,需要拿到拷貝自己後產生的新的物件,然後對新的物件的引用型別再呼叫拷貝操作,實現對引用型別成員變數的深拷貝。

public class student implements cloneable 

public void setsubject(subject subject)

public string getname()

public void setname(string name)

public int getage()

public void setage(int age)

/*** 重寫clone()方法

* @return

*/@override

public object clone() catch (clonenotsupportedexception e)

}@override

public string tostring()

}

一樣的使用方式

public class shallowcopy 

}

輸出結果:

studenta:[student: 460141958,subject:[subject: 1163157884,name:yuwen],name:lynn,age:20]

studentb:[student: 1956725890,subject:[subject: 356573597,name:lishi],name:lily,age:18]

由輸出結果可見,深拷貝後,不管是基礎資料型別還是引用型別的成員變數,修改其值都不會相互造成影響。

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...

淺拷貝和深拷貝

以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...

深拷貝和淺拷貝

ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...