2012-03-13 3 views
-1

Я определил объект int[][]. Поскольку это объект, если я отправлю его методу в качестве параметра, он отправит его только ссылку, поэтому любые изменения в массиве метода будут влиять на него в основной программе. Поэтому я хотел бы сделать клон этого объекта внутри метода, но я не уверен, как это сделать.Java 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[][] :(

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

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

+0

Почему бы вам не проверить его, выяснить, что происходит, а затем задать разъясняющие вопросы о чем-то, что вы не понимаете? –

+1

Я не думаю, что int [] [] - это объект, поэтому вам не нужно беспокоиться об этом. –

+7

@drgomesp: Да, * все * массивы являются ссылочными типами. –

ответ

1

Вы можете использовать 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, что означает, что вы можете изменить значения копии, не затрагивая оригинал.

+0

Нет смысла в первом вызове 'clone()' - если вы собираетесь перезаписать каждый элемент, почему бы просто не использовать 'int [] [] copy = new int [3] [];'? –

+0

@JonSkeet Первоначально у меня был такой ответ ('int [] [] copy = new int [matrix.length] []'), но изменил его для использования операции clone(). Я не думаю, что есть заметная разница в производительности с любым вариантом, это скорее вопрос согласованности - если это клон, это клон на всем протяжении. –

+0

Я думаю, что это вводит в заблуждение. Вы * не хотите копировать ссылки массива, так зачем писать код так, как если бы вы делали? Я думаю, что это было бы намного яснее без первого вызова клона. Если вы пытались объяснить кому-то, что вы хотели, чтобы код делал, вы бы сказали: «Теперь мы хотим создать массив ссылок' int [] ', которые совпадают с существующими ссылками' int [] 'в оригинале массив "? –

1

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

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

+0

, то почему бы эти ребята сказать иначе? http://stackoverflow.com/questions/9644896/java-multidimensional-array-considered-a-primitive-or-an-object – AndreiBogdan

+0

@AndreiBogdan: Сам массив является ссылкой. Этот ответ правильный. Но каждый элемент 'int' массива является значением. – Tudor

2

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

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

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

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

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

1

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

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

+0

, то почему бы эти ребята сказать иначе? http://stackoverflow.com/questions/9644896/java-multidimensional-array-considered-a-primitive-or-an-object – AndreiBogdan

+1

int является примитивным типом, int [] [] ist primitive type. – MJM

+0

Я не говорю, что int не является примитивным типом, и я не говорю, что массив примитивов примитивен. Я сказал, что его код создает новую копию, что и делает. –

Смежные вопросы