数组的值在没有影响它的任何命令的情况下更改

时间:2016-09-17 19:33:06

标签: java arrays variables

我在下面的代码中遇到了一个奇怪的问题:

public class Main {
public static void main(String args[]){
    int[] c = {0};
    int[] a = c;
    int[] b = c;

    a[0] = 1;
    b[0] = 2*a[0];

    System.out.println(" a " + a[0]);
}
}

这返回" a 2",而不是" 1",这意味着数组a的值发生了变化,即使该操作只会影响数组b ! 有谁知道这可能来自哪里,以及如何解决它?

2 个答案:

答案 0 :(得分:4)

罪魁祸首在这里:

int[] c = {0};
int[] a = c;
int[] b = c;

您认为您正在创建三个不同的数组,但实际上它们都指向同一个数组c

System.out.println(a + "-" + b + "-" + c); //[I@1b6d3586-[I@1b6d3586-[I@1b6d3586

所有变量实际上都指向内存中的同一个数组。

答案 1 :(得分:0)

您所做的就是有效地创建与声明数组时相同数组的2个副本:

    int[] a = c;

这与写作相同:

    int* a = c;

写,c与& c [0]相同,它是数组的基地址。

所以:

    int[] c = {0};
    int[] a = c;
    int[] b = c;

    a[0] = 1;  // This also sets the value of c[0] and b[0] to 1
    b[0] = 2*a[0]; // This is 2 * 1 = 2