java中的数组是通过引用传递还是按值传递?

Nos*_*tap 3 java arrays pass-by-reference

阵列中的java通过引用传递或传值?(我之前提出过类似的问题,但是他们似乎没有得到一个好的答案,所以希望这次会有所不同).

假设我有一个名为data包含某种类型的对象的数组.现在让我们假设我在A类中传递并存储该数组,然后将其传递给B类,B类更改数组中的一个条目.A类的阵列会改变吗?如果这是一个原始数组(例如int)而不重要吗?那么ArrayLists呢?

谢谢

Mat*_*hen 8

Java中的所有内容都是按值传递的.但是,如果您传递引用,则它是引用的值.

由于Java方法无法进入调用者的堆栈来重新分配变量,因此没有方法调用可以更改那里的引用(地址)的标识.当我们说Java不是通过引用传递时,这就是我们的意思.这与C++(和类似语言)形成对比,在某些情况下允许这样做.

现在让我们来看看一些效果.

如果我做:

Object[] o = ...
mutateArray(o);
Run Code Online (Sandbox Code Playgroud)

所述内容可以是不同的事后,因为所有mutateArray需要是一个数组的改变其内容的地址.但是,地址o将是相同的.如果我做:

String x = "foo";
tryToMutateString(x);
Run Code Online (Sandbox Code Playgroud)

之后的地址x再次相同.由于字符串是不可变的,这意味着它仍然是"foo".

改变对象是改变它的内容(例如成功改变最后一个元素o,或者试图将"foo"的最后一个字母改为"d").这不应该与重新分配xo在呼叫者的堆栈中混淆(不可能).

通过共享呼叫的维基百科部分可能会有更多的亮点.