2015-06-08 188 views
0

我有一段代碼給了我一個意想不到的輸出。我相信這與存儲空間有關,正如我在下面所描述的那樣。但我很不確定。變量被覆蓋

代碼:

public static void main(String[] args) { 

     int [] x = {1,2}; 
     int [] y = plusOne(x); 
     System.out.println(x[0] + " " + x[1]); 
     System.out.println(y[0] + " " + y[1]); 
    } 

    public static int [] plusOne(int [] x) { 
     System.out.println("x :"+ x); 
     int [] y = x;//1 2 

     x = new int [x.length]; 
     System.out.println("y: "+y); 
     for (int i=0; i<y.length;i++){ 
      x[i] = y[i]; 
     } 
     for (int i=0; i<y.length;i++){ 
      y[i] = y[i] + 1; 
     } 
     return y; 
    } 

預期輸出:

1 2 
2 3 

實際輸出:

2 3 
2 3 

從我目前掌握的發現是,分配兩個整數的時候。即int x = y,這會導致x的存儲位置被分配給y的存儲位置,因爲它們沒有正確初始化。但我不是100%肯定的,我在這裏寫的是我能找到的。

+1

在代碼'刪除這些線(INT I = 0;我

回答

0

您將要覆蓋在你的方法plusOne()x[]陣列。下面是示例代碼將實現你腦子裏了最初:

public static int[] plusOne(int[] x) { 
    int[] y = new int[x.length]; 
    System.arraycopy(x, 0, y, 0, x.length); 

    for (int i=0; i < x.length; ++i) { 
     y[i] = x[i] + 1; 
    } 

    return y; 
} 

這裏我輸入數組x[]複製到一個新的數組​​,然後初始化​​到x[]加一加。

plustOne()方法中下面的代碼是你的問題的根源:

int [] y = x; 
for (int i=0; i < y.length; ++i) { 
    y[i] = y[i] + 1; 
} 

分配​​指向x[]它存在main()方法調用,然後取消引用數組和增加一個內容。因此x[]數組會增加1,並且該方法還會將x[]加1。

+0

謝謝。我會盡快給你印記。但是我還有一個額外的問題,爲什麼上面的代碼不能使用單個整數和字符串,而是使用數組?我在eclipse中做了一些測試。 –

+0

您的代碼將導致任何陣列AFAIK出現問題。 –

0

變化

int [] y = x.clone(); 

說明

要了解怎麼回事,加上你的主要方法如下聲明

System.out.println(x+ ""+ y); 

在第一種情況下,您會看到x和y都具有相同的ID,因爲賦值運算符只是將引用分配給原始數組。

在第二種情況下,你會看到x和y不同的ID。 Becasue clone()函數創建原始數組的副本。