【问题标题】:How does `array = array` actually work? [duplicate]`array = array` 实际上是如何工作的? [复制]
【发布时间】:2019-01-01 10:34:02
【问题描述】:

我想了解array = array 的实际作用。

为什么编辑 data1 会导致 data2 稍后在此过程中被更改?

String[][] data1 = new String[5][1];
String[][] data2 = new String[1][1];

data1[0][0] = "Test 1";
data2 = data1;

//Prints "Test 1"
System.out.println(data2[0][0]);

data1[0][0] = "NEW";

//Prints "NEW"
System.out.println(data2[0][0]);

【问题讨论】:

  • data2 = data1;。 data2 和 data1 都引用同一个数组 (new String[5][1])
  • 我已经很久没有做Java了,但我认为这只是因为两者的数据类型相同。如果假设data2 不是二维字符串数组,那么data2 = data1 将出错。
  • 这在C语言中更容易理解,其中数组实际上是数组第一个元素的地址。 data2 = data1 实际上让两个变量指向同一个数组。

标签: java arrays multidimensional-array


【解决方案1】:

在Java中,数组名实际上保存了数组的起始地址(类似于c/c++)。数组索引是从起始地址的偏移量。

所以,当你使用array2 = array1 时,你实际上是在告诉编译器:

"Let array2 hold the same address as array1"

【讨论】:

  • 感谢您的解释。所以要解决问题我应该手动复制数组对吗?
  • @X3Gamma 阅读 pritam 的答案
  • 除非两者都是引用而不是地址。
【解决方案2】:
data2 = data1;

在第 4th 行,您命令 data1 将引用 data2 从现在开始引用的位置。因此,两个引用都引用同一个对象。通过使用其中一个参考进行的任何修改都将被彼此看到。这就是 = 运算符在 Java 中的实际作用。从技术上讲,就是引用复制这种方式。

【讨论】:

  • 这样的问题表明运算符重载是一个坏的想法。很高兴 Java 没有它。
  • @M.leRutte 这取决于。仅仅因为重载运算符时需要小心并不意味着运算符重载是一件坏事。它只是意味着人们应该小心谨慎,并且只在有意义的地方进行。那至少是我的两分钱。
【解决方案3】:

正如前面的答案中已经提到的那样,当您使用 = 运算符时,它指的是同一个位置,更改会反映在两者中。

如果您不希望这样,那么您应该使用克隆数组。您可以参考answer 了解如何操作。

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 1970-01-01
    • 2016-04-17
    • 2016-06-25
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    相关资源
    最近更新 更多