Java int [] [] объект массива - PullRequest
0 голосов
/ 13 марта 2012

Я определил int[][] объект.Поскольку это объект, если я отправлю его методу в качестве параметра, он отправит только свою ссылку, поэтому любые изменения массива в методе будут влиять на него в основной программе.Поэтому я хотел бы сделать клон этого объекта внутри метода, но я не уверен, как это сделать.

Я думал о чем-то вроде этого:

private void myMethod( int[][] array )
{
    //Define our temporary array (clone)
    int[][] newArray = new int[3][3];

    //Go through the elements of the array
    for .... row = 0; row < ..; row++
        for ..... col = 0; col < ..; col++
           //Copy individual elements from one array to another
           newArray[row][col] = array[row][col];
}

, ноПриведенный выше код скопирует каждый элемент из массива в newArray как значение (т. е. клон элемента) или просто ссылку?

Если это так, как это можно сделать.Если бы я использовал ArrayLists вместо int[][] объектов, есть метод clone () или что-то в этом роде, но у меня нет этого метода для int[][] объектов: (

Кроме того, если яЯ не ошибаюсь, если я сделаю это внутри метода newArray = array, который снова скопирует только ссылку, поэтому оба будут указывать на один и тот же int[][] объект: (

PS Я знаю, я мог бы просто проверить этоНо я бы хотел немного обсудить это с вами, ребята, и посмотреть, что именно.

Ответы [ 4 ]

2 голосов
/ 13 марта 2012

, но приведенный выше код скопирует каждый элемент из массива в newArray как значение (т. Е. Клон элемента) или просто ссылку?

Вы копируетекаждый элемент массива и каждый элемент является int, так что все в порядке.Новый массив будет полностью независим от исходного.

Обратите внимание, что если бы вместо этого вы сделали:

int[][] newArray = new int[3][];
for (int i = 0; i < 3; i++) {
    newArray[i] = array[i];
}

... тогда , который просто скопировал быссылки на три существующих int[] массива в newArray.Но вы выделили совершенно новый набор массивов (один int[][] и 3x int[]), поэтому все они независимы.

1 голос
/ 13 марта 2012

Вы можете использовать clone() в матрице и в каждом массиве, соответствующем строке в матрице, это будет работать без проблем, потому что вы клонируете матрицу примитивных значений, например:

int[][] matrix = new int[3][3];
// ... matrix gets filled ...
int[][] copy = matrix.clone();
for (int i = 0; i < matrix.length; i++)
    copy[i] = matrix[i].clone();

Приведенное выше описание создает матрицу copy, которая не зависит от matrix, что означает, что вы можете изменять значения копии, не затрагивая оригинал.

1 голос
/ 13 марта 2012

int - это примитивный тип, вы всегда передаете их как значение, а не как ссылку, поэтому ваш код действительно создаст новую копию массива.

Возможно, вы захотите использовать Arrays.copyOf (), это может быть быстрее.

1 голос
/ 13 марта 2012

Примитивные типы, такие как int, не являются ссылочными типами.Таким образом, при просмотре всех элементов и их копировании по одному произойдет копирование по значению.

Короче говоря, ваш код верен.

...