分配两个彼此相等的数组问题

时间:2018-06-18 05:42:26

标签: java arrays pointers memory-management reference

public static void main(String[]args) {


    int[] x = {1, 2, 3, 4};
    int[] y ;
    y = x;
    x[1] = 11;
    x = new int[2];

    x[0]=99;
    for (int i = 0; i < y.length; i++)
      System.out.print(y[i] + " ");
    System.out.println("");
    for (int i = 0; i < x.length; i++)
          System.out.print(x[i] + " ");
}
答案是

1 11 3 4 
99 0

我的问题是,当我分配两个数组时,我认为它们共享相同的更改,因为它们是对象...就像我设置x[1] = 11;时它改变了y的值,所以不应该&#39 ; ty在将其更改为2个大小的数组后仍然与x相同,或者因为我正在更改它们不再指向同一地址的大小?

7 个答案:

答案 0 :(得分:8)

int[] x = {1, 2, 3, 4};

{1, 2, 3, 4}被分配为数组。对它的引用分配给x

int[] y ;
y = x;

同一数组的引用也分配给y

x[1] = 11;

xy引用的数组现在都是{1, 11, 3, 4}

x = new int[2];

由于Java语义,新的数组被分配为{0, 0}。对x的引用已分配给x。现在yx[0]=99; 指的是两个不同的数组。没有调整大小。

x

{99, 0}引用的数组已更改,现在包含y。这与{1, 11, 3, 4}引用的数组无关,仍然很高兴[NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory valueOptions:NSMapTableCopyIn]

答案 1 :(得分:4)

x

此行创建一个长度为2的 new 数组,然后使y指向该新数组。此时,原始数组仅由x[0] = 99; 引用。

{{1}}

此行将 new 数组中的第0个元素指定为99,因此原始数组保持不变。

答案 2 :(得分:2)

让我逐行了解您的代码

当你这样做时

阶段#1:

int[] x = {1, 2, 3, 4};

HEAP 中创建一个数组对象,并将此 INTEGER ARRAY OBJECT 的地址指定给引用变量x

阶段#2:

int[] y ;
y = x;

另一个引用变量y,可以存储整数数组对象,现在存储与前一个变量x相同的地址

阶段#3:

x = new int[2];

使用关键字new,我们指示JVM在中创建 整数数组对象长度为2,并将此新创建的对象的地址发送到x内。

这意味着现在使用新数据(新创建的对象的地址)重新分配数据(上一个对象的地址)。

但这并不意味着引用变量y中的地址也会被重新分配。

这意味着它仍然保留其中的数据(前一个对象的地址),当您使用for循环打印两个数组时,您将获得输出:

1 11 3 4

99 0

答案 3 :(得分:1)

我已经根据您的变量和内存分配/内存引用的内容对您的代码进行了评论,请告知我是否清楚。

public static void main(String[]args) {


    int[] x = {1, 2, 3, 4}; // x -> [1|2|3|4]
    //the reference x points to this data structure in memory
    int[] y ; // y (variable y is not yet pointing to anywhere in memory)
    y = x; // y, x  -> [1|2|3|4] x and y points to the same array
    x[1] = 11; //y,x -> [1|11|3|4] 
    x = new int[2]; //y -> [1|11|3|4] and x -> [0|0]

    x[0]=99; // y -> [1|11|3|4] and x -> [99|0]
    for (int i = 0; i < y.length; i++)
      System.out.print(y[i] + " ");
    System.out.print("");
    for (int i = 0; i < x.length; i++)
          System.out.print(x[i] + " ");
}

答案 4 :(得分:1)

如果你谈论这段代码..

y = x;  // this actually only reference of same array is going to assign.

在上面的代码中只有参考。将被分配,xy都指向同一个数组对象。

因此,如果x中所做的任何更改都会自动反映到y

从这里开始

 x = new int[2];

x分配了大小为2的新数组。因此,创建了一个全新的大小为2的数组并分配给它。

所以现在,如果x中的任何更改都不会反映到y,反之亦然。

谢谢你:)

答案 5 :(得分:1)

使用关键字new后,将创建具有不同地址的新数组对象。 在第4行:x = new int [2];

所以你要为x分配一个新的数组对象。这不再是您在第1行中初始化的数组。因此,值的更改。

答案 6 :(得分:0)

int[] x = {1, 2, 3, 4};
int[] y ;
y = x;

直到第3行,x和y都具有与初始化

相同的数组值

在Java中使用new的格式是 name = new type [size];

x = new int[2];

这将按指定的方式将内存分配给x(数组中的2个整数值)。这将覆盖之前持有的值

进一步初始化数组时的默认值是 0表示数字类型 false表示布尔类型 引用类型为NULL

因此,数组的值为{0,0},然后更改为{99,0}。