原始数据类型数组与原始数据类型操作
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 时可以操纵原始值有关?
第一个例子很简单,因为数组 a
和 b
都指向内存中的同一个对象,更改一个会影响另一个。换句话说,当您执行 b = a;
时,您实质上是从 a
复制 reference 并将其存储到 b
,这意味着 [=10] =] & b
持有数组的 引用 。
第二个例子你基本上是复制变量 a
的 value 并将其存储到 b
,有 no a
和 b
之间的关系,改变一个 不会 影响另一个。
在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 = 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;
我现在想起来可能效率更高。
怎么会这样
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 时可以操纵原始值有关?
第一个例子很简单,因为数组 a
和 b
都指向内存中的同一个对象,更改一个会影响另一个。换句话说,当您执行 b = a;
时,您实质上是从 a
复制 reference 并将其存储到 b
,这意味着 [=10] =] & b
持有数组的 引用 。
第二个例子你基本上是复制变量 a
的 value 并将其存储到 b
,有 no a
和 b
之间的关系,改变一个 不会 影响另一个。
在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 = 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;
我现在想起来可能效率更高。