2016-07-26 237 views
0

从我所了解的Java(这可以说很少= P),Java对待原始值不同于对象。我能想到的一个例子是,基元是按值传递的,而对象是通过它们引用的值传递的。浅拷贝与基元

延伸这一点,我已经实现创建int数组码,和浅复制它交给INT的一个新的数组:

public class Test { 
    public static void main(String[] args){ 
    int[] array = {2,3,4,5}; 
    int[] copy = array; 
    copy[1] = 0; 

    for (int i : copy){ 
     System.out.print(i);} 
    System.out.println(); 

    for (int i : array){ 
     System.out.print(i);} 
} 
} 

然而,输出是:

2045 
2045 

所以,我困惑的是为什么两个阵列都改变了?我认为当我们复制原始数组时,我们只复制了元素的值(因为我们正在处理基元)?

+0

没有,你只是创建了第二个参考指向同一个数组。 – Stultuske

+0

ooooooh,这很有道理。因此,如果我要创建一个新的int []副本并将每个元素从数组单独复制到for循环中,则不会发生这种情况。确实是 – javanewbie

+0

。多一点炒锅,但它会解决你的问题 – Stultuske

回答

1

根本没有复制数组。你所做的就是使参考文献arraycopy指向内存中相同的数组。因此,当您通过一个参考更改数组时,另一个参考将指向相同的更改。

+0

是的,似乎我犯了一个错误,只复制了参考。谢谢! – javanewbie

0

数组是对象。当您设置

int[] copy = array; 

两个copyarray指向同一个对象。您的更新

copy[1] = 0; 

更新“both”。

0

当你完成了任务copy[1] = 0,你告诉渣取其中copy指向数组,到位置1,并指定值0。因为你也有下面的语句

int[] copy = array; 

然后copyarray指的是内存中的同一个数组。你从来没有真正做过浅拷贝,你只分配了另一个变量来指向同一个数组。

如果你想使数组的副本,那么你可以尝试:

int[] copy = Arrays.copyOf(array, array.length);