【发布时间】:2011-11-03 00:03:08
【问题描述】:
在复制整个数组时,我经常看到人们这样写:
int[] dest = new int[orig.length];
System.arraycopy(orig, 0, dest, 0, orig.length);
但在我看来,没有理由赞成这一点:
int[] dest = orig.clone();
无论如何,它们都是浅拷贝。可能这些人只是没有意识到clone 的存在。那么有什么理由不使用clone?
【问题讨论】:
-
System.arraycopy将每个元素从orig复制到dest,然后是深拷贝,而不是浅拷贝。 -
它使
dest[0]引用与orig[0]相同的对象。所以如果orig[0]是一个数组,dest[0]将包含完全相同的数组实例;它不会克隆子阵列。这不是深拷贝。这不正确吗? -
在您的示例中,您使用了
int原语。然后dest[0]得到orig[0]在复制时的值。如果之后orig[0]的值 发生变化,则不会再影响dest[0]的值。如果该值是一个对象引用(就像在Object[]数组中一样(其元素可以是int[]数组),那么该对象当然可能会发生变异。 -
当然,但我的例子只是一个例子。关键是
arraycopy并不比clone“更深”,无论你对深/浅的含义是什么。