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

时间:2012-02-04 05:36:44

标签: java arrays pass-by-reference

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

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

谢谢

3 个答案:

答案 0 :(得分:8)

Java中的所有内容都是按值传递的。但是,如果您传递了引用,那么它就是引用的值。

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

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

如果我这样做:

Object[] o = ...
mutateArray(o);
之后内容可能会有所不同,因为所有mutateArray需要的是更改其内容的数组的地址。但是,o的地址将相同。如果我这样做:

String x = "foo";
tryToMutateString(x);

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

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

call by sharing上的维基百科部分可能会有所增加。

答案 1 :(得分:-3)

与所有其他对象一样,数组通过引用传递(从技术上讲,您通过值传递引用,但从对象的角度来看,它是通过引用传递的)。如果将数组传递给方法并且方法更改了数组,则调用者将看到更改。如果您想避免修改副本,则需要自行复制。数组是否包含基元或对象无关紧要。通常,这是您想要的行为,因为按值传递会在每次将其用作参数时不必要地复制(可能很大)数组。

答案 2 :(得分:-4)

它的主旨是 - Java中的所有东西都是通过引用传递的,除非它是原始的。