2015-01-12 2 views
0

Я написал следующий фрагмент кода, чтобы проверить поведение функций System.arraycopy и clone. Я ожидаю, что эти функции вернут копию массива, но все, что они делают, возвращает ссылку на исходный массив, что видно из более поздней части программы, где я изменяю значения оригинала. Копия не должна меняться, но она также изменяется. Пожалуйста, помогите, почему он ведет себя таким образом?Почему функция System.arraycopy() не создает копию, но возвращает ссылку на тот же массив?

public class Testing { 

    public static int a[][] = new int[2][2]; 

    public static void setValueOfA() { 
     a[0][0] = 1; 
     a[0][1] = 1; 
     a[1][0] = 1; 
     a[1][1] = 1; 
    } 

    public static int[][] getValueOfA() { 
     int[][] t = new int[2][2]; 

// Case 1: Not working 
//  t = (int[][]) a.clone(); 
// Case 2: Not working 
//  System.arraycopy(a, 0, t, 0, 2); 
// Case 3: Working 
     for (int i = 0; i < 2; i++) { 
      for (int j = 0; j < 2; j++) { 
       t[i][j] = a[i][j]; 
      } 
     } 
     return t; 
    } 

    public static void main(String[] args) { 
     int[][] temp; 

     setValueOfA(); 
     temp = getValueOfA(); 
     System.out.println("Value of a"); 
     for (int i = 0; i < 2; i++) { 
      for (int j = 0; j < 2; j++) { 
       System.out.print(a[i][j] + " "); 
      } 
      System.out.println(); 
     } 
     System.out.println("Value of temp"); 
     for (int i = 0; i < 2; i++) { 
      for (int j = 0; j < 2; j++) { 
       System.out.print(temp[i][j] + " "); 
      } 
      System.out.println(); 
     } 

     a[0][0] = 2; a[0][1] = 2; a[1][0] = 2; a[1][1] = 2; 

     System.out.println("Value of a"); 
     for (int i = 0; i < 2; i++) { 
      for (int j = 0; j < 2; j++) { 
       System.out.print(a[i][j] + " "); 
      } 
      System.out.println(); 
     } 
     System.out.println("Value of temp"); 
     for (int i = 0; i < 2; i++) { 
      for (int j = 0; j < 2; j++) { 
       System.out.print(temp[i][j] + " "); 
      } 
      System.out.println(); 
     } 
    } 
} 
+0

'System.arraycopy' ничего не создает и не возвращает никакой ссылки (т. Е. Это' void'). – weston

ответ

2

Я считаю (не проверял его), что System.arraycopy выполняет мелкую копию исходного массива в целевом массиве.

Ваш призыв к System.arraycopy эквивалентно:

t[0] = a[0]; 
t[1] = a[1]; 

С a[0] и a[1] сами являются массивами, если впоследствии изменить a[i][j], вы также изменения t[i][j] (так a[i] и t[i] относятся к одному массиву).

+0

Это правильный ответ. Продемонстрировано здесь: http://ideone.com/lcvj4N – nhylated

Смежные вопросы