为什么不引用同一个对象的两个变量会改变其中一个变量呢?

时间:2016-08-26 14:19:20

标签: java string

问题

以下代码显示,当将数组影响到另一个数组时,这两个数组会相互依赖。

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引用相同的字符串,因此更改一个将影响另一个。

3 个答案:

答案 0 :(得分:3)

使用时

#chk1

然后<img src="img.pl/ax.png" /> <img src="q.pl/ph.png"/> <div id="error" style=""> <div id="icoka"><i class="image icon"></i></div> <div id="content-text-error">Sorry, image not found : (</div> <div style="clear:both;"></div> </div> 是同一数组的引用。更改int tab2 [] = tab; 的值意味着您更改了tab2tab2[0]指向的数据结构中的值。

使用

tab

创建tab2的新实例,它不会更改ch2 = "hi"; 之前引用的对象。

答案 1 :(得分:2)

您无法更改String本身,只需为ch2 参考设置另一个值,因此引用即可一个新的String对象,ch1仍然引用旧的String对象。

要使您的数组代码与字符串代码类似,您需要稍微更改一下

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

int tab2 [] = tab;

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

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

答案 2 :(得分:2)

这样想。

数组和字符串都基于地址运行。

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

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

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