Во-первых, массив не является примитивным типом;это объект.Во-вторых, многомерные массивы реализованы как массивы массивов.Кроме того, метод clone
для массивов неглубокий.Когда вы clone
многомерный массив, ваш новый многомерный массив по-прежнему ссылается на исходные внутренние массивы.
board -> [ . . . ]
| | |
v v v
[0, 2, 3], [4, 1, 5], [7, 8, 6]
^ ^ ^
| | |
twin -> [ . . . ]
Таким образом, когда вы изменяете значения, вы не копируете из двух разных массивов,вы копируете из того же массива, поэтому вы получаете [2, 2, 3].
Если вы собираетесь клонировать многомерный массив, вам нужно будет клонировать его полностьювплоть до одномерных массивов.
int [][] twin = board.clone();
for (int i = 0; i < board.length; i++) {
twin[i] = board[i].clone();
}
Теперь я получаю [[2, 0, 3], [4, 1, 5], [7, 8, 6]]
.
Другие возможности включают объявление вашего нового многомерного массива без клонирования, использование циклов и System.arraycopy
длякопировать отдельные одномерные массивы.