这个javacode到底做了什么?

时间:2013-12-16 23:34:05

标签: java arrays

我有一个数组a1和a2

代码a1 = a2是什么;到底怎么办?复制数组a1中的所有元素? 这就是我的想法,但似乎没有发生?

不,它不会复制任何数组元素,而是分配引用。总之,它意味着a1引用与a2完全相同的数组对象引用。

代码:

int[] a1 = new int[] { 1, 2, 3 };
int[] a2 = new int[] { 4, 5, 6 };
a1 = a2;
a1[1] = 3;
a2[2] = 2;
a2 = a1;
for (int i = 0; i < a2.length; i++) {
System.out.print(a2[i] + " ");
}

有人可以解释为什么结果是4 3 2而不是4 3 6?

3 个答案:

答案 0 :(得分:4)

不,它不会复制任何数组元素,而是分配引用。总而言之,这意味着a1引用与a2相同的完全相同的数组对象引用

如果要复制元素,可以使用for循环或System.arraycopy(...)

如果你想做一个副本,那么我会使用for循环,并制作每个元素的副本,可能是复制构造函数或克隆,或者是什么使得最多感觉阵列所持有的物品。


修改

您的附加代码和我的评论:

int[] a1 = new int[] { 1, 2, 3 }; 
int[] a2 = new int[] { 4, 5, 6 }; 
a1 = a2;  // both array variables refer to the one same array object, 4, 5, 6
a1[1] = 3;   // you're changing the one single array's 2nd item
a2[2] = 2;   // you're changing the same array's 3rd item
a2 = a1;  // this does nothing really as they already refer to the same object
for (int i = 0; i < a2.length; i++) { 
  System.out.print(a2[i] + " "); 
}
  

那就是为什么结果是4 3 2而不是4 3 6?

是的,请参阅评论

答案 1 :(得分:1)

它使a2引用a1所做的相同数组。

内存中实际只存在一个数组副本。这意味着如果您开始更改a1的元素,那么当您从a2读取时,这些更改将会显示。

答案 2 :(得分:1)

a1a2都是对象引用。当您说a1 = a2时,a1字面设置为a2的对象引用。这意味着a1a2都指向堆上的同一个对象。