数组意外行为

时间:2016-09-24 12:32:27

标签: java arrays

所以我试图做一个非常简单的任务,即获取两个相同的数组,并将第一个数组的第一个值设置为第二个数组的最后一个值。

以下代码显示我尝试使用numberArrayduplicateArray执行此操作。然而,大部分代码是我试图找出为什么我得到一个奇怪的结果。

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;

这不应该有所作为吗?将一个数组设置为另一个不应该链接它们(或者我认为)。

2 个答案:

答案 0 :(得分:3)

正如我评论的那样,你的两个数组都指向内存中的相同数组

int[] numberArray = {1, 2, 3};
int[] duplicateArray = numberArray; // duplicateArray is just a another name for numberArray

因此,如果您使用名称duplicateArraynumberArray更改任何值,则表示您正在更改内存中由两者指向的数组。

因此,您需要使用numberArrayduplicateArray的元素添加到System.arraycopy来创建新数组;

像这样

int[] numberArray = {1, 2, 3};
int[] duplicateArray = new int[numberArray.length];
System.arraycopy( numberArray , 0, duplicateArray , 0, numberArray .length );

查看视觉图像

visual representation of answer

答案 1 :(得分:0)

以前的答案是正确的,澄清一下,虽然数组的整数元素是不可变的,但数组本身却不是。从本质上讲,你有两个引用的数组; 'duplicate'不是重复的对象,只是重复的引用。