原始数据类型数组与原始数据类型操作

Arrays of primitive data types vs. primitive data type manipulation

怎么会这样

int[] a = {0, 1};
int[] b = a;
a[0] = 1;
b[0] = 2;
System.out.println(a[0] + b[0]);

打印 4 和这个

int a = 2;
int b = a;
b += 3;
System.out.println(a);

打印 2。

这是否与数组如何使用 byReference 以及如何在纯原始操作使用 byValue 时可以操纵原始值有关?

第一个例子很简单,因为数组 ab 都指向内存中的同一个对象,更改一个会影响另一个。换句话说,当您执行 b = a; 时,您实质上是从 a 复制 reference 并将其存储到 b,这意味着 [=10] =] & b 持有数组的 引用

第二个例子你基本上是复制变量 avalue 并将其存储到 b,有 no ab 之间的关系,改变一个 不会 影响另一个。

在Java中,数组变量是对象引用。

{0, 1} 是 shorthand 语法,用于创建具有给定值的数组。以下都是一样的:

int[] a = {0, 1};

int[] a = new int[] {0, 1};

int[] a = new int[2];
a[0] = 0;
a[1] = 1;

因此,当您编写 b = a; 时,b 变量被赋予与 a 变量相同的引用值,即它引用相同的数组。因此,a[0]b[0] 引用相同的值。

换句话说:数组变量存储对数组的引用。它不存储数组本身,因此 b = a; 不会 复制数组。

int 是原始类型,不是对象,因此它只包含一个值。当您将一个原语分配给另一个原语 (a = b) 时,您只是为第一个原语赋予与第二个原语相同的值。因此,当您更改第二个时,它对第一个没有影响。

int[]是一个数组,它是一个对象,数组的所有元素也是。这意味着它们实际上指向内存中的一个位置。当您将一个对象分配给另一个对象时(a[0] = b[0] 甚至 a = bab 是数组时),您将它们都指向内存中的同一个位置。所以当你改变第二个时,它也会改变第一个,因为它们实际上指向同一个东西。

如果您希望 b[0] 仅包含 a[0],您可以这样做:

    int[] a = {1, 2};
    int [] b = new int[2];
    b[0] = Arrays.copyOf(a,1)[0];

换句话说,当你只复制a的第一个元素时,新数组的第0个元素。

更新:您也可以 运行 通过原语,像这样:

int x = a[0];
b[0] = x;

我现在想起来可能效率更高。