【问题标题】:Arrays of primitive data types vs. primitive data type manipulation原始数据类型数组与原始数据类型操作
【发布时间】:2017-04-30 11:22:04
【问题描述】:
这是怎么回事
int[] a = {0, 1};
int[] b = a;
a[0] = 1;
b[0] = 2;
System.out.println(a[0] + b[0]);
打印 4 和 this
int a = 2;
int b = a;
b += 3;
System.out.println(a);
打印 2.
这是否与数组如何使用 byReference 以及在纯原始操作使用 byValue 时可以操作原始值有关?
【问题讨论】:
标签:
java
arrays
types
primitive
【解决方案1】:
int 是一个原语,而不是一个对象,所以它只包含一个值。当您将一个原语分配给另一个 (a = b) 时,您只是将第一个原语赋予与第二个相同的值。因此,当您更改第二个时,它对第一个没有影响。
int[] 是一个数组,它是一个对象,数组的所有元素也是。这意味着它们实际上指向内存中的一个位置。当您将一个对象分配给另一个对象(a 和 b 是数组时,a[0] = b[0] 甚至 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;
现在我认为它可能更有效。
【解决方案2】:
在 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; 不复制数组。
【解决方案3】:
第一个例子很简单,因为数组a 和b 都指向内存中的同一个对象,改变一个会影响另一个。换句话说,当您执行b = a; 时,您实际上是从a 复制reference 并将其存储到b,这意味着a 和b 都持有一个对数组的引用。
第二个例子你基本上是复制变量a的值并将其存储到b中,a和@之间没有no关系987654331@,更改一个不会影响另一个。