Java: int [] [] является примитивным типом?Или он генерирует другой экземпляр с помощью метода clone ()? - PullRequest
2 голосов
/ 23 марта 2019

Я работаю с доской int [n] [n]:

0 2 3 
4 1 5 
7 8 6 

Я хочу сделать копию с именем twin, а затем вернуть измененную копию.

Например:

    int [][] twin = board.clone();

    twin[0][0] = board[0][1];
    twin[0][1] = board[0][0];

    return twin;

То, что я ожидал, будет:

//board
0 2 3 
4 1 5 
7 8 6 

//twin
2 0 3 
4 1 5 
7 8 6 

Но результат будет:

//board
2 2 3 
4 1 5 
7 8 6 

//twin
2 2 3 
4 1 5 
7 8 6 

Доска и близнецбыли одинаковыми все время, и клон не работал, как ожидалось.Это потому, что int [] [] не является объектом?

Есть ли способ клонировать int [] [] и изменить то, что я ожидал?Стоит ли зацикливаться на доске и копировать значения в twin?

Ответы [ 2 ]

6 голосов
/ 23 марта 2019

Во-первых, массив не является примитивным типом;это объект.Во-вторых, многомерные массивы реализованы как массивы массивов.Кроме того, метод 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 длякопировать отдельные одномерные массивы.

1 голос
/ 23 марта 2019

Цитирование JLS Глава 10. Массивы :

В языке программирования Java массивы являются объектами

Нет int[][] не примитив.


Цитирование JLS 10.7. Члены массива :

Клон многомерного массива неглубокий, то есть он создает только один новый массив. Подмассивы являются общими.

Внешний массив - это новый экземпляр, подмассивы - нет.

...