从一个数组到另一个数组的奇怪副本值

时间:2013-10-29 14:20:26

标签: java

当我在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 个答案:

答案 0 :(得分:6)

String[] y = x;

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

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

用Java来详细阐述:

String[] y = {...};

表示您声明y对数组的引用,而不是数组本身。因此,在分配时,您将分配引用而不是复制对象值。

答案 1 :(得分:2)

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

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

因此,当您更改x的内容时,y的内容将会更改。

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

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

现在,如果你发现xy将不会被更改。

答案 2 :(得分:1)

在Java Array中被视为对象引用。您正在将值更改为参考。

为了说明试试这个

   String[] x = {"A"};
   String[] y = x;    
   System.out.println(x==y);   //true -> X and Y are pointing the same reference. 

答案 3 :(得分:0)

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

String [] x = {“A”};

和x现在保持对此数组的引用。当您将x分配给y时,它只是将对x的引用复制到y变量,所以现在x和y都表示相同的数组。当您在一个数组中更改某些内容时,更改也会影响其他数组。 Look here for better understanding