在 Java 中,数组是 reference 类型,而不是 value 类型。这意味着数组变量只存储对实际数组的引用。
例如,考虑以下代码:
int[] numbers = new int[3];
在本例中,numbers 是对 3 个ints 数组的引用。这可以说明如下:
Java 堆栈 | Java 堆
|
|整数数组:
+---------+ | +---+---+---+
|数字 |------------->| 0 | 0 | 0 |
+---------+ | +---+---+---+
| 0 1 2
现在假设你有一个这样的方法:
public void compute(int[] someValues) {
someValues[2] = 78;
}
假设您使用 numbers 变量作为参数调用此方法:
int[] numbers = new int[3];
compure(numbers);
在这种情况下,numbers reference 被 按值 传递给 compute。因此,someValues 是numbers 引用 的副本(不是numbers 引用的数组的副本)。因此,它看起来像这样:
Java 堆栈 | Java 堆
|
|整数数组:
+---------+ | +---+---+---+
|数字 |------------->| 0 | 0 | 0 |
+---------+ | --> +---+---+---+
| / 0 1 2
+------------+ | /
|一些值|-----/
+------------+ |
compute返回后,会是这样的:
Java 堆栈 | Java 堆
|
|整数数组:
+---------+ | +---+---+----+
|数字 |------------->| 0 | 0 | 78 |
+---------+ | --> +---+---+----+
| / 0 1 2
+------------+ | /
|一些值|-----/
+------------+ |
numbers[2] 将等于someValues[2],因为numbers 和someValues 引用同一个数组。
叹气,自从我开始写我的答案以来,这似乎已经得到了类似的回答。希望 ASCII 图表值得保留!