因此,我尝试执行一项非常简单的任务,即获取两个相同的数组并将第一个数组的第一个值设置为第二个数组的最后一个值。
下面的代码显示我尝试使用 numberArray
和 duplicateArray
来执行此操作。然而,大部分代码是我试图找出为什么我得到一个奇怪的结果。
System.out.print("Normal array 1: ");
for (int l = 0 ; l < numberArray.length ; l++){
System.out.print(numberArray[l]);
}
System.out.print("Duplicate array 1: ");
for (int l = 0 ; l < duplicateArray.length ; l++){
System.out.print(duplicateArray[l]);
}
System.out.println();
numberArray[0] = duplicateArray[duplicateArray.length - 1];
System.out.print("Duplicate array 2: ");
for (int l = 0 ; l < duplicateArray.length ; l++){
System.out.print(duplicateArray[l]);
}
System.out.println();
System.out.print("Normal array 2: ");
for (int l = 0 ; l < numberArray.length ; l++){
System.out.print(numberArray[l]);
}
输出:
Normal array 1: 123
Duplicate array 1: 123
Duplicate array 2: 323
Normal array 2: 323
对我来说毫无意义的是,即使我应该将一个对象的值设置为另一个对象,但两者都在发生变化。
我对Java的理解是这样的:
array[x] = array2[y];
//value at index x of "array" now equals value at index y of "array 2"
//however, array2 should not be changed at all since it is just referenced in the above line of code, not mutated
我错过了一些非常简单的东西吗?我绞尽脑汁想弄清楚这个问题。任何帮助将不胜感激。
编辑:
我被要求提供两个数组的声明,所以它们在这里:
int[] numberArray = {1, 2, 3};
int[] duplicateArray = numberArray;
这应该不会有什么不同吧?将一个数组设置为另一个数组不应将它们链接起来(至少我是这么认为的)。
最佳答案
正如我评论的那样,你的两个数组都指向内存中的同一个数组
int[] numberArray = {1, 2, 3};
int[] duplicateArray = numberArray; // duplicateArray is just a another name for numberArray
因此,如果您使用名称 duplicateArray
或 numberArray
更改任何值,则意味着您正在更改两者所指向的内存中的数组。
因此,您需要使用 System.arraycopy
将 numberArray
的元素添加到 duplicateArray
来创建一个新数组;
像这样
int[] numberArray = {1, 2, 3};
int[] duplicateArray = new int[numberArray.length];
System.arraycopy( numberArray , 0, duplicateArray , 0, numberArray .length );
查看图像的视觉 View
关于java - 数组意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39676374/