问题
以下代码显示,当将数组影响到另一个数组时,这两个数组会相互依赖。
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
两个变量ch1
和ch2
引用相同的字符串,因此更改一个将影响另一个。
答案 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;
的值意味着您更改了tab2
和tab2[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 = arr3
,arr2
也不会改变。 arr1
将被重新命名为arr3
指向的新地址。但是当您说arr1[0]
时,您实际上是在尝试更改存储在位置中的值,因此它也会影响arr2
或arr3
,具体取决于最新的分配。