什么是更好的浅或深克隆?

use*_*ser 3 java cloning

我对java中的对象克隆有点困惑.浅层克隆和深度克隆之间的主要区别是什么?

哪个好多了?

T.J*_*der 15

浅层克隆和深度克隆之间的主要区别是什么?

浅层克隆复制树的顶层,但是从该顶层指向的任何内容(例如,对象属性)仍由两个副本共享.深度克隆复制树的所有级别,在源和副本之间不留任何链接.

例如,假设你有一个Person带有spouse属性的对象(a),它也是一个Person对象:

+-------------+
| Person: a   |
+-------------+
| name: "Joe" |               
| spouse      |-------------->+---------------+
+-------------+               | Person        |
                              +---------------+
                              | name: "Mary"  |
                              +---------------+

如果你做一个浅浅的克隆ab,双方ab指向同一个 Person从他们的spouse属性:

+-------------+
| Person: a   |
+-------------+
| name: "Joe" |               
| spouse      |------+
+-------------+      |        
                     |
+-------------+      +------->+---------------+
| Person: b   |      +------->| Person        |
+-------------+      |        +---------------+
| name: "Joe" |      |        | name: "Mary"  |
| spouse      |------         +---------------+
+-------------+       

如果你进行深度克隆,你不仅要克隆ab,而是克隆a.spouseb.spouse它们,以便它们每个都有自己副本.

+-------------+
| Person: a   |
+-------------+
| name: "Joe" |               
| spouse      |-------------->+---------------+
+-------------+               | Person        |
                              +---------------+
+-------------+               | name: "Mary"  |
| Person: b   |               +---------------+
+-------------+       
| name: "Joe" |       
| spouse      |-------------->+---------------+
+-------------+               | Person        |
                              +---------------+
                              | name: "Mary"  |
                              +---------------+

哪个好多了?

都不是.两者都有用途,两者都可能被滥用.