2012-11-05 164 views
0

爲了讓我的問題可以理解,我使用下面的示例代碼。這段代碼的輸出是5,而我希望它是3.我猜測B是作爲A的指針工作的,但我希望A最初被複制到B中,並且A中的後續更改不應該影響B 。如何擺脫指針?

import java.io.*; 
public class fg 

{ 

public static void main(String args[]) throws Exception 
{ 

    int[] A = new int[3]; 
      A[0]=1; 
      A[1]=3; 
      A[3]=7; 

    check(A); 


} 

public static void check(int[] A) 
{    
    int[] B = A; 

    A[1] = 5; 

    System.out.println(B[1]); 
} 

}

+0

您是否在尋找類似於int [] b = new int [](A);'? –

+0

'int [] [] A = new int [3];'不會編譯!將其更改爲'int [] A = new int [3];' – jlordo

+0

@jlordo:謝謝,修正它。這只是一個錯字。 – iamlegend

回答

5

你需要明確創建一個副本,

int[] B = Arrays.copyOf(A, A.length); 

因爲int[]是引用類型,所以賦值只是複製引用(基本上,指針)。

如果數組的元素本身不是原始的類型,你可能會需要一個深拷貝,所以

type B[] = new type[A.length]; 
for(int i = 0; i < A.length; ++i) { 
    B[i] = makeCopyOf(A[i]); 
} 

其中makeCopyOf()應該創建一個type實例的一個明智的副本。如果你沒有找到更好的,type makeCopyOf(type orig) { return orig.clone(); }可以作爲後備。

+1

我會質疑克隆()的使用 - 請參閱http://www.artima.com/intv/bloch13.html –

+0

謝謝,@布萊恩,非常翔實。 –

2

B是參考,因此類似於指針(有各種差異 - 你不能算術,它不是一個直接的內存指針)。

因此,您必須創建您指的copy of the structure (the array)。請注意,如果您要複製對象,則可能需要深層副本。你可能必須在複製構造函數中執行此操作(請參閱本文中的why clone() is considered broken