将一个数组的值复制到另一个数组中的奇怪问题

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个回答

6
String[] y = x;

这意味着数组 y 现在引用数组 x

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

更进一步地,在Java中:

String[] y = {...};

这意味着你声明y是一个指向数组的引用,而不是数组本身。因此,当你赋值时,你是在赋一个引用,而不是复制对象的值。

请告诉我在哪里可以找到更详细的阅读材料? - Drylozav
但是,为什么这段代码: public class Application { public static void main(String[] args) { String x = "A"; String y = x; x = "B"; System.out.print(x + " " + y); } } 会显示正确的结果"B A"? - Drylozav

2

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

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

当你改变x的内容时,y的内容也会被改变。
如果你想复制数组,可以使用Arrays#copyOf
String[] y = Arrays.copyOf(x, x.length);

现在,如果您更改xy将不会改变。

1
在Java中,数组被视为对象引用。您正在更改对引用的值。
举个例子来说明:
   String[] x = {"A"};
   String[] y = x;    
   System.out.println(x==y);   //true -> X and Y are pointing the same reference. 

0

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

String[] x = {"A"};

x现在保存了对此数组的引用。当您将x分配给y时,它只是将对数组x的引用复制到y变量中,因此现在x和y都表示相同的数组。当您更改一个数组中的内容时,更改也会影响另一个数组。 点击此处以获得更好的理解


此链接未重定向。 - Drylozav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接