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

时间:2017-04-30 02:35:02

标签: java arrays types primitive

为什么会这样

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?

3 个答案:

答案 0 :(得分:1)

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

第二个示例基本上是复制变量a并将其存储到b中,{之间存在关系{1}}和a,更改一个会影响另一个。

答案 1 :(得分:1)

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

{0, 1}是用于创建具有给定值的数组的简写语法。以下是完全相同的:

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; 不会复制数组。

答案 2 :(得分:1)

int是一个原语,而不是一个对象,所以它只包含一个值。当您将一个基元分配给另一个基元(a = b)时,您只需给第一个基元与第二个基元相同的值。因此,当您更改第二个时,它对第一个没有影响。

int[]是一个数组,它是一个对象,数组的所有元素也是如此。这意味着他们实际上指的是记忆中的一个地方。当a[0] = b[0]a = b是数组时,将一个对象分配给另一个对象(a甚至b)时,您将它们指向内存中的同一位置。因此,当您更改第二个时,它也会更改第一个,因为它们实际上指向同一个事物。

如果您希望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;

现在我认为它可能更有效率。