2017-05-06 37 views
1

为什么此代码返回4 4而不是4 1?关于不返回期望值的数组的简单代码片段

我跟踪的新values[k]是4至for循环,但我明白,int[]号码被复制到原来的int[]数值数组,所以没有int[]号通过了环带int[]值的变化?

这是我不知道的规则吗?

int[] values = { 1, 3, 1, 3, 1 }; 
int[] numbers = values; 
for (int k = 0; k < values.length; k++) 
{ 
    values[k] = k * 2; 
} 
System.out.print(values[2]); 
System.out.print(" " + numbers[2]); 
+1

在发布到stackoverflow之前,请先调试您的代码。如果你最终停止了你的赛果,你应该看到两个数组是平等的。 – betontalpfa

回答

0

因为在Java中,数组是references。基本上,values不是数组本身,而是“引用”或“指向”一个数组的东西。引用和数组本身断开连接。

当你做numbers = values时,你不需要创建一个值的副本,而是放入一个名为numbers的新数组,而是让数字指向值相同的值。这意味着只要你改变其中一个,你就会改变它们。有关如何制作values的副本,请参见Make copy of array Java

+0

谢谢,我很感激,这真的很有帮助。 – Saksham

0

你得到相同的结果values[2] = 4numbers[2] = 4因为你已经设置此:

int[] numbers = values; 

两个数组指向相同的内存不会忽略,所以如果你在其中的一个第二个会改变也改变了。


想了解更多,您可以打印两个数组:

System.out.println(values); 
System.out.println(numbers); 

你会得到相同的参考:

[[email protected] 
[[email protected] 
+1

谢谢!我现在知道了。 – Saksham

0

因为int[] numbers = values;拷贝阵列values(只是相同的参考分配给numbers)。您可以使用Arrays.copyOf(int[], int),如

int[] numbers = Arrays.copyOf(values, values.length); 

您的预期行为。

0

由于数组不是基元类型,所以当您将数组变量分配给另一个数组时,将复制该引用。有关详情,请参见this answer

在你的情况下,数字变量指向与值相同的内存位置。因此,答案是4 4.