public class Test {
public static void main(String[] args) {
int[] a = {1, 2, 3, 4, 5};
int[] b = a;
int[] c = {6, 7, 8};
a = c;
for(int i = 0; i < a.length; i ++)
System.out.print(a[i] + " ");
System.out.print("\n");
for(int i = 0; i < b.length; i ++)
System.out.print(b[i] + " ");
System.out.print("\n");
}
}
我初始化了数组a并将a的引用分配给新数组b。现在我初始化了一个新的数组c并将其引用传递给了数组a。由于数组b是对数组a的引用,因此b应该具有c中的新值,但b具有旧的a值。它背后的原因是什么? 输出如下 -
输出 -
6 7 8
1 2 3 4 5
答案 0 :(得分:5)
不要被名字&#39;列表&#39;激怒。这些图像来自python可视化,但原理在Java
中是相同的为数组a
分配了一个新数组:
数组b
已分配给a
后面的实例:
为数组c
分配了一个新数组:
最后a
被分配给c
后面的实例,b
未被重新分配,仍然保留对旧a
的引用:
从pythontutor.com上的可视化文件中获取的图像
答案 1 :(得分:1)
当您将a的值赋给b时,表示b指的是分配给数组a的相同空间。这意味着b将获取对数组a所做的任何更改,但是如果对变量a进行了任何更改。如果a指的是引用新数组,b仍将引用旧的引用。
var path = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDocuments);
var filename = System.IO.Path.Combine(path.ToString(), strFile);
System.IO.FileStream fs = new FileStream(filename, FileMode.Open);
byData = new byte[fs.Length];
fs.Read(byData, 0, (int)fs.Length);
fs.Close();
答案 2 :(得分:0)
当您对b=a
b进行引用时。但是当你a=c
a指的是c时,但仍然b引用旧对象(该对象的地址为已分配的值并且它是常量的)a
您指定的因为它就是它包含在您分配时。
除非你重新分配它,否则它不会改变。
答案 3 :(得分:0)
假设您将一个对象视为一个房子,并将一个引用视为一张纸,上面写着一个房子的地址。 mutable_gpu_data
,a
和b
都是引用。所以当你说
c
你正在建造一座有1,2,3,4和5的房子;而 int[] a = {1, 2, 3, 4, 5};
是一张纸,上面写着那个房子的地址。
a
int[] b = a;
是另一个参考,这意味着它是另一张纸。但它上面有相同房子的地址。
b
现在我们建造一座新房子并将6,7和8放入其中。 int[] c = {6, 7, 8};
a = c;
将是一张纸,上面写着新房子的地址。当我们说c
时,那些曾经是a = c
的纸条被抛出,我们用新房子的地址制作一张新纸。这是a
的新价值。
但a
是另一张纸。它没有改变。我们所做的一切都没有改变它。
参考文献就是这样。
答案 4 :(得分:0)