我有一个数组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?
答案 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)
a1
和a2
都是对象引用。当您说a1 = a2
时,a1
字面设置为a2
的对象引用。这意味着a1
和a2
都指向堆上的同一个对象。