我想要浅拷贝它,那么我能不能只做这个操作:
int[] shallow = orig;
这并不是一个真正的浅拷贝。一个拷贝应该是一个与原始对象相似但不是原始对象本身的离散实体。在你的例子中,实际上你有两个指向同一对象的引用。当你创建一个拷贝时,你应该得到两个结果对象:原始对象和拷贝对象。
在这里,任何你对shallow
所做的修改也会发生在orig
上,因为它们都指向同一个对象。
“浅度”是当你比较的对象在内部有引用其他对象时发挥作用。例如,如果你有一个整数数组并创建一个副本,你现在有两个包含相同整数值的数组:
Original Array
[0]
[1]
[2]
[3]
After copying:
[0] <--- Original [0]
[1] [1]
[3] [2]
[4] Copy ---> [3]
然而,如果你有一个由对象组成的数组(比如说objArr1
和objArr2
),那么当你进行浅拷贝时,你现在有了两个新的数组对象,但是两个数组之间相应位置的条目指向同一个对象(因为对象本身没有被复制,只有引用被复制)。
Original Array:
[0:]----> [object 0]
[1:]----> [object 1]
[2:]----> [object 2]
[3:]----> [object 3]
复制后(注意相应位置指向相同实例):
Original -> [0:]----> [object 0] <----[:0] <- Copy
[1:]----> [object 1] <----[:1]
[2:]----> [object 2] <----[:2]
[3:]----> [object 3] <----[:3]
现在,如果您通过替换条目或删除条目来修改objArr1
,那么同样的事情不会发生在objArr2
上。然而,如果您修改了objArr1 [0]
处的对象,则 objArr2 [0]
中也会反映出来,因为这些位置指向相同的对象。因此,在这种情况下,即使容器对象本身是不同的,它们包含的是对同一对象的引用。
当您进行深层复制时,您将获得两个新数组,其中每个对应位置指向不同的实例。因此,基本上您要一路复制对象。
我的教授说,对于基元类型(shallow和deep copy)本质上是相同的,我们必须复制数组的每个索引。
需要强调的区别是,当您复制基元类型的数组时,您只需完全复制值即可。每次都会得到一个新的基元类型。但是,当您有一个对象数组时,您所拥有的是一个对象引用数组。因此,当您创建副本时,您所做的就是创建一个具有原始数组中引用的副本。然而,这些引用的新副本仍然指向相应的相同对象。这就是所谓的浅复制。如果您深度复制了数组,那么每个单独位置引用的对象也将被复制。因此,您会看到以下内容:
Original -> [0:]----> [object 0] Copy -> [0:]----> [copy of object 0]
[1:]----> [object 1] [1:]----> [copy of object 1]
[2:]----> [object 2] [2:]----> [copy of object 2]
[3:]----> [object 3] [3:]----> [copy of object 3]
但是将整个数组等于另一个数组并不会产生相同的效果,对吧?
不,不会。你所做的只是创建了一个对现有数组的新引用:
arr1 -> [0, 1, 2, 3, 4]
现在假设你执行了arr2 = arr1
。你所拥有的是:
arr1 -> [0, 1, 2, 3, 4] <- arr2
所以这里arr1
和arr2
都指向同一个数组。因此,使用arr1
进行的任何修改都将在使用arr2
访问数组时反映出来,因为您正在查看相同的数组。当你复制时这种情况不会发生。
int[]
不是原始类型,而是一个数组。 - Greg Hewgill