【问题标题】:Why don't two variables referencing the same object change when one of them does? [duplicate]为什么引用同一对象的两个变量在其中一个发生变化时不会发生变化? [复制]
【发布时间】:2016-08-26 14:19:19
【问题描述】:

问题

下面的代码显示,当一个数组影响另一个数组时,两个数组相互依赖。

int tab [] = {1,2,3};

int tab2 [] = tab;

tab2[0] = 5;

System.out.print(tab[0]); // 5

我想知道为什么这与类型 String 不同,因为如果我们有以下内容:

String ch1 = "hello";

String ch2 = ch1;

ch2 = "hi";

System.out.print(ch1); // hello

ch1ch2 这两个变量引用的是同一个字符串,所以改变一个会影响另一个。

【问题讨论】:

  • 这两个变量显然没有引用同一个字符串,正如您的 sn-p 所展示的那样。
  • 在第一个示例中,您正在修改由两个变量引用的某些内容的值。在第二个示例中,您将更改 ch2 的引用。
  • 在Java中改变String是不可能的,String提供了不可变的对象。

标签: java string


【解决方案1】:

这样想。

数组和字符串都基于地址进行操作。

当您说arr1 = arr2 时,您是在告诉arr1 将指向与arr2 相同的地址位置。

对于字符串,“XYZ”也是一个字符串,其中包含一个地址位置。当您说str1 = str2 时,str1 将指向与str2 相同的地址。但是当你说str1 = "XYZ" 时,“XYZ”是另一个存储在不同地址的对象。因此,str1 将被重新分配给新地址。

即使是数组,如果你说arr1 = arr3arr2 也不会改变。 arr1 将重新指向arr3 指向的新地址。但是当你说arr1[0] 时,你实际上是在尝试更改存储在位置中的值,因此它也会影响arr2arr3,具体取决于哪个分配是最新的。

【讨论】:

  • 分析情况后,我得出的结论与您解释的相同。感谢您的回答。
【解决方案2】:

当你使用

int tab2 [] = tab;

那么tab2 是对同一数组的引用。更改tab2[0] 的值意味着您更改了tabtab2 都指向的数据结构内的值。

使用

ch2 = "hi";

创建String 的新实例,它不会更改ch2 之前引用的对象。

【讨论】:

  • 请不要将String 的不变性带入其中,这无关紧要。相同的概念适用于任何类型。这个问题是变量的重新赋值。
  • 是的,不变性不是原因。即使对于可变对象,它的工作方式也是一样的。
  • @SotiriosDelimanolis 是正确的,我删除了它。
【解决方案3】:

您并没有更改String 本身,您只是为ch2 reference 设置另一个值,因此它引用 到一个新的String 对象, ch1 仍然引用旧的 String 对象。

为了让你的数组代码和字符串代码相似,你需要稍微改动一下

 int tab [] = {1,2,3};

int tab2 [] = tab;

tab2 = new int[]{5,6,7};

System.out.print(tab[0]); // 1

【讨论】:

  • System.out.println 实际上会打印 1,我会在最后删除该评论。
  • 我认为他的意思是tab2[0]
  • @user3078643 不,它是tab[0] 我只是在评论中弄错了,应该是 1,而不是 5,因为 tab 仍然是原始数组。
  • 我明白了,谢谢你的回答。
猜你喜欢
  • 2014-03-25
  • 2017-05-09
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 2021-10-07
  • 2014-03-06
  • 1970-01-01
  • 2017-07-17
相关资源
最近更新 更多