Java中的数组赋值和引用

时间:2017-06-24 04:21:12

标签: java arrays reference

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

5 个答案:

答案 0 :(得分:5)

不要被名字&#39;列表&#39;激怒。这些图像来自python可视化,但原理在Java

中是相同的

为数组a分配了一个新数组:

Assigning a

数组b已分配给a后面的实例:

Assigning b

为数组c分配了一个新数组:

Assigning c

最后a被分配给c后面的实例,b未被重新分配,仍然保留对旧a的引用:

Re-Assigning 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_dataab都是引用。所以当你说

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)

这就是原因:

What is Object Reference Variable?

对象有2个对象(数组)和3个引用(a,b,c)。你只是在事物所指的地方交换。