Почему функция System.arraycopy() не создает копию, а возвращает ссылку на тот же массив?
Я написал следующий фрагмент кода для проверки поведения функций 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();
}
}
}
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]
ссылаются на тот же массив).
Arrays.copyOf неявно использует System.arraycopy, который выполняет только поверхностное копирование.
Чтобы сделать глубокую копию, используйте традиционный способ повторения и присвоения.
МООН,
Вы должны использовать Arrays.copyOf()
функция. Смотрите пример:
http://www.tutorialspoint.com/java/util/arrays_copyof_int.htm
/ N.