3

当我在看 Java 中的代码示例时,我看到了一段奇怪的代码:

public class Application {
     public static void main(String[] args) {
          String[] x = {"A"};
          String[] y = x;
          x[0] = "B";
          System.out.print(x[0] + " " + y[0]);
     }
}

我不明白,为什么结果“B B”是正确的?当我创建并初始化数组 x 和 y 并分配数组 x 的零元素等于 B 时,我认为答案必须是“B A”。

4

4 回答 4

6
String[] y = x;

表示数组y现在引用数组x

因此,改变的内容x意味着改变的内容y(因为它们是相同的)。

详细地说,在Java中,这个:

String[] y = {...};

意味着您声明y对数组的引用,而不是数组本身。因此,当您分配时,您分配的是引用而不是复制对象值。

于 2013-10-29T14:22:16.447 回答
2

这就是我们在 Java 中复制数组的方式。这就是你现在正在做的事情:

  x        y
+---+    +---+ 
| a |<---|-- |
+---+    +---+

所以当你改变 的内容时x, 的内容y也会改变。

如果要复制数组,可以使用Arrays#copyOf

String[] y = Arrays.copyOf(x, x.length);

现在,如果你 chagne xy将不会改变。

于 2013-10-29T14:22:45.297 回答
1

在 Java 中,数组被视为对象引用。您正在将值更改为引用。

为了说明尝试这个

   String[] x = {"A"};
   String[] y = x;    
   System.out.println(x==y);   //true -> X and Y are pointing the same reference. 
于 2013-10-29T14:24:03.710 回答
0

当调用赋值运算符时,Java 总是按值复制。你这样声明你的第一个数组:

字符串[] x = {"A"};

x 现在持有对该数组的引用。当您将 x 分配给 y 时,它只是将对数组 x 的引用复制到 y 变量,所以现在 x 和 y 都代表同一个数组。当您更改一个数组中的某些内容时,该更改也会影响其他数组。 看这里以获得更好的理解

于 2013-10-29T14:27:42.647 回答