java - 数组意外行为

标签 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;

这应该不会有什么不同吧?将一个数组设置为另一个数组不应将它们链接起来(至少我是这么认为的)。

最佳答案

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

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

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

因此,您需要使用 System.arraycopynumberArray 的元素添加到 duplicateArray 来创建一个新数组;

像这样

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

查看图像的视觉 View

visual representation of answer

关于java - 数组意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39676374/

相关文章:

java - 使用 Hibernate 进行数据访问抽象

Java JPA 负载平衡读取查询以读取 MySql DB 从站

java - 高效存储和检索许多位置点以在 mapoverlay 中显示

php - 在 PHP 中解析 BIG XML

c - 我需要将一个数组分成 5 份并在每个中打印重复

java - 如何检查 String[] 类型的页面属性?

java - XMPP Smack 无法接收消息

python - 重建 numpy 数组,需要更快的方法

javascript - 使用正则表达式创建一个新数组以查找以 A 到 J 开头的元素

Python - 在混合数组(整数、列表)中查找值的每次出现