我已经定义了一个int[][]
对象。因为它是一个对象,如果我将它作为参数发送给方法,它只会发送它的引用,所以对方法中数组的任何更改都会影响它在主程序中的作用。所以我想在方法中复制这个对象,但我不知道如何实现这个目标。
我在考虑这样的事情:
private void myMethod( int[][] array )
{
//Define our temporary array (clone)
int[][] newArray = new int[3][3];
//Go through the elements of the array
for .... row = 0; row < ..; row++
for ..... col = 0; col < ..; col++
//Copy individual elements from one array to another
newArray[row][col] = array[row][col];
}
但是上面的代码会将数组中的每个元素复制到newArray中作为值(所以...是项目的克隆),还是只是引用?
如果是这样,如何实现这一目标。如果我使用ArrayLists而不是int[][]
个对象,那么就有clone()方法或类似的东西,但我还没有int[][]
个对象的方法:(
另外,如果我在方法newArray = array
中执行此操作时没有弄错,那么它将再次仅复制引用,因此两者都将指向相同的int[][]
对象:(< / p>
P.S。我知道我可以测试一下,但我想和你们讨论一下,看看到底是什么。
答案 0 :(得分:2)
但是上面的代码会将数组中的每个元素复制到newArray中作为值(所以...是项目的克隆),还是只是引用?
您正在复制数组的每个元素,而每个元素都是int
,所以您没问题。新阵列将完全独立于原始阵列。
请注意,如果您已完成:
int[][] newArray = new int[3][];
for (int i = 0; i < 3; i++) {
newArray[i] = array[i];
}
...然后 只会将对三个现有int[]
数组的引用复制到newArray
。但是你已经分配了一组全新的数组(一个int[][]
和3个int[]
),所以它们都是独立的。
答案 1 :(得分:1)
原始类型(例如int
)不是引用类型。因此,遍历所有项目并逐个复制它们将进行按值复制。
简而言之,您的代码是正确的。
答案 2 :(得分:1)
int是一种基本类型,你总是将它们作为值传递,而不是作为引用,所以你的代码确实会创建一个新的数组副本。
你可能想要考虑使用Arrays.copyOf(),它可能会更快。
答案 3 :(得分:1)
您可以在矩阵上使用clone()
,并在矩阵中与行对应的每个数组上使用int[][] matrix = new int[3][3];
// ... matrix gets filled ...
int[][] copy = matrix.clone();
for (int i = 0; i < matrix.length; i++)
copy[i] = matrix[i].clone();
,它可以正常工作,因为您正在克隆原始值矩阵,如下所示:
copy
以上内容将创建一个独立于matrix
的{{1}}矩阵,这意味着您可以更改副本的值而不会影响原始值。