Ошибка при копировании массива в другой в Java - PullRequest
2 голосов
/ 01 ноября 2010

После того, как я в течение некоторого времени гуглял, я знаю, что существует довольно много способов скопировать массив в другой в Java, а именно с помощью System.arraycopy.

Однако некоторые из моих друзей пытались использовать это:

boolean a[][] = new boolean[90][90];
boolean b[][] = new boolean[90][90];

/* after some computations */

a = b

Это дает довольно недетерминированный результат, кто-нибудь знает, что это на самом деле делает?

Ответы [ 3 ]

11 голосов
/ 01 ноября 2010

Это совсем не недетерминировано.

a = b;

просто присваивает значение b a. Значение b является ссылкой на массив - так что теперь обе переменные содержат ссылки на один и тот же массив. Старое значение a не имеет значения - и если оно ссылается на массив, на который больше ничего не ссылается, оно теперь будет иметь право на сборку мусора.

Обратите внимание, что это не относится к массивам - это способ всех ссылочных типов работать в Java.

По сути, вы вообще не копируете один массив в другой - вы копируете ссылку в массив в другую переменную. Вот и все.

0 голосов
/ 01 ноября 2010

Строки кода и их значения:

boolean a[][] = new boolean[90][90];

Выделите массив и присвойте ему ссылку на a

boolean b[][] = new boolean[90][90];

Выделите второй массив и присвойте ему ссылку на b

a = b;

Назначить значение bs (ссылка на второй массив) a.

До а = б;

a ---------> First arrays memory space

b ---------> Second arrays memory space

После a = b;

a ---           First arrays memory space
     ---
        ------>
b ------------> Second arrays memory space

Теперь вы потеряли первый массив навсегда

0 голосов
/ 01 ноября 2010

Помните, что a = b означает, что вы присваиваете значение b a

    boolean a[][] = new boolean[90][90];
    boolean b[][] = new boolean[90][90];
    a[0][3]=false;
    b=a;
    a[0][5]=true;

    System.out.println(b[0][3]);
    System.out.println(b[0][5]);

Вывод: -

false

true

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...