2013-12-16 151 views
3

我有一个数组a1和a2这个javacode究竟做了什么?

什么是代码a1 = a2;准确地做?复制Array 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] + " "); 
} 

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

+0

Java中唯一不是对象的东西是原始类型(byte,char,int,float等)。基元将会复制它们的值而不是引用。 – DeathByTensors

+0

我将此行为解释为:“对象分配不*创建副本/克隆/副本。”因此,结果是*原始*对象现在被多个名称知道(“引用”):即'a1'和'a2'。 – user2864740

回答

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?

是的,看评论

+0

:好吧,听起来很合逻辑!这里是代码:int [] a1 = new int [] {1,2,3}; \t \t int [] a2 = new int [] {4,5,6}; \t \t a1 = a2; \t \t a1 [1] = 3; \t \t a2 [2] = 2; \t \t a2 = a1; for(int i = 0; i user3084311

+0

哦,上帝,我真的需要学习如何格式化评论...对不起 – user3084311

+0

@ user3084311:你不能在评论中格式化代码。相反,编辑您的原始问题,发布格式化的代码,然后通知我们所有人对我们的答案发表评论。 –

1

这使得A2指同一个阵列A1也。

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

1

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