淺複製的時候,如果本裡面包含了物件這個就會出現問題,bean裡面的對bean的引用是位址的引用而非真正實體的引用,
list
list = new arraylist<>();
list.add(new student("小哥","女人", "lalalalaalala"));
student student = new student("大哥","女人", "null");
person person = new person("11","老師","女",student,list);
person person1 = new person();
beanutils.copyproperties(person,person1);
student.setfactior("地球人");
list.get(0).setgirlfriends("我愛你中國,你會在**啊啊,在**啊");
system.out.println(person);
system.out.println(person1);
結果如下所示:
person, list=[student]}
person, list=null}
如果你對引用物件的修改,會導致原來bean裡面的bean的屬性也會被修改的(物件對物件的引用是由物件之家的的位址檢進行連線的,正如上面所寫物件屬性的修改導致整個物件屬性之間的修改),對於list集合潛伏著不會將其複製過去,物件之間的clone也屬於淺複製的一項。
要實現真正的深複製,我個建議使用二進位製流來進行檔案流來進行,這樣就會將位址重新複製*(將該物件序列化成流,因為寫在流裡的是物件的乙個拷貝,而原物件仍然存在於jvm裡面。所以利用這個特性可以實現物件的深拷貝)
先將其序列化進行二進位制的讀取
bytearrayoutputstream bo = new bytearrayoutputstream();
objectoutputstream oo = new objectoutputstream(bo);
oo.writeobject(o);
然後反序列化,從流裡讀取出來,即完成複製
bytearrayinputstream bi = new bytearrayinputstream(bo.tobytearray());
objectinputstream oi = new objectinputstream(bi);
outer = (outer) ois.readobject();
JAVA ArrayList的淺複製問題
arraylist的add方法的原始碼,可以看到僅僅是把物件用 號複製了一下,但是更改如果更改外邊的e的話,arraylist裡的物件就會隨之改變 public boolean add e e 測試 public class sayhello public static class test imp...
OC深淺複製問題
呢。這裡為了便於朋友們理解,定義如下。淺 復 制 在複製操作時,對於被複製的物件的每一層複製都是指標複製。深 復 制 在複製操作時,對於被複製的物件至少有一層複製是物件複製。完全複製 在複製操作時,對於被複製的物件的每一層複製都是物件複製。注 1 在複製操作時,對於物件有n層是物件複製,我們可稱作n...
淺複製 深複製
second,來說說shallow copy and deep copy的定義和我自己的一些理解。僅供參考 淺複製 shallow copy 如果欄位是值型別的。則對該字段執行逐位複製,如果欄位是引用型別,則複製引用但不複製引用的物件 因此,原始物件及其副本引用同一物件。即被複製物件的所有變數都含有...