这段Java代码到底是做什么的?

3

我有一个数组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吗?

在Java中,唯一不是对象的东西是原始类型(byte、char、int、float等)。原始类型的值将被复制而不是引用。 - DeathByTensors
我解释这个行为的方式是:“对象赋值不会创建副本/克隆/重复项。”因此,结果是原始对象现在被多个名称所知道(“引用”),即 a1a2 - user2864740
3个回答

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。

好的,听起来很合理!这是代码: 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? :) 谢谢伙计。 - user3084311
天啊,我真的需要学会如何格式化注释...对此很抱歉。 - user3084311
@user3084311:你不能在评论中格式化代码。相反,编辑您的原始问题,在格式化的代码中发布,然后通过对我们的答案进行评论来通知我们所有人。 - Hovercraft Full Of Eels
谢谢伙计!真的帮了我很多! - user3084311

1
它使得a2指向与a1相同的数组。
实际上,内存中只存在一个数组副本。这意味着,如果您开始更改a1的元素,则在从a2读取时,这些更改将显示出来。

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接