Почему функция 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.

Другие вопросы по тегам