2013-05-02 6 views
0

У меня есть простой целочисленный массив, который инициализировать так:Копировать целочисленный массив в массив

int [][] tempArray=bp.getArray();//get array from other class(bp) 
//doing things with tempArray... 

Когда я изменить tempArray также изменить bp.getArray();. Это потому, что он ссылается на bp.getArray();?

+0

Это полностью зависит от того, как реализуется 'bp.getArray();'. – jlordo

+2

Массивы - это объекты, и ваш метод возвращает ссылку на тот же объект массива, о чем свидетельствует тот факт, что изменение его с помощью одной ссылки видно из всех других ссылок. – Patashu

ответ

4

Да, если вам нужна новая ссылка, вам просто нужно использовать Arrays.copyOf. Другие функции: Array.clone и System.arrayCopy.

Arrays.copyOf// is a Java 6 feature. For older versions switch to System.arrayCopy. 

    public static int[][] deepCopy(int[][] original) { 
     if (original == null) { 
       return null; 
     } 

     final int[][] result = new int[original.length][]; 
     for (int i = 0; i < original.length; i++) { 
      result[i] = Arrays.copyOf(original[i], original[i].length); 
     } 
     return result; 
    } 

Это глубоко скопировать 2d массив.

+0

Вопрос: Будет ли это делать мелкие или глубокие операции копирования? Поскольку мы имеем дело с двумерным массивом, если Arrays.copyOf просто копирует ссылки на каждый внутренний массив, у нас будет проблема. –

+0

@ alex23 Что делать, если я создаю только новый экземпляр? –

+0

Я создаю новый экземпляр массива, и я копирую второй массив? Или это ссылка? –

-1

Правильный ответ: вам нужна глубокая копия. Вы назначены ссылки (указатели), а не присваиваете значения.

Arrays.copyOf() или System.arraycopy() будут работать, но только на нижнем уровне int [].

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

Чтобы сделать это правильно (на 2-х уровнях):

public int[][] copy2Deep (int[][] src) { 
    int[][] dest = new int[ src.length][]; 
    for (int i = 0; i < src.length; i++) { 
     dest[i] = Arrays.copyOf(src[i], src[i].length); 
    } 
    return dest; 
} 

Это должно работать - основной принцип заключается в том, что int[][] действительно является одномерным массив int[] с некоторым синтаксическим добавлением сахара.

Из-за этого нижнее измерение не требуется для создания массива (оно будет заполнено исходными дочерними массивами изначально), а src.length можно использовать для возврата длины верхнего измерения.

Смотрите также: Efficient System.arraycopy on multidimensional arrays

Надеется, что это помогает.

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