为什么会这样
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?
答案 0 :(得分:1)
第一个例子很简单,因为数组a
和b
都指向内存中的同一个对象,更改一个会影响另一个。换句话说,当您执行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;
现在我认为它可能更有效率。