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相同,或者因为我正在更改它们不再指向同一地址的大小?
答案 0 :(得分:8)
int[] x = {1, 2, 3, 4};
{1, 2, 3, 4}
被分配为数组。对它的引用分配给x
。
int[] y ;
y = x;
同一数组的引用也分配给y
。
x[1] = 11;
x
和y
引用的数组现在都是{1, 11, 3, 4}
。
x = new int[2];
由于Java语义,新的数组被分配为{0, 0}
。对x
的引用已分配给x
。现在y
和x[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.
在上面的代码中只有参考。将被分配,x
和y
都指向同一个数组对象。
因此,如果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}。