Как правильно клонировать двумерный массив в Java?

Ответ

Клонирование двумерного массива требует глубокого копирования, так как array.clone() и Arrays.copyOf() выполняют лишь поверхностное копирование (копируются ссылки на вложенные массивы).

Правильный способ для массивов примитивов (например, int[][]):

int[][] original = {{1, 2}, {3, 4}};

// 1. Создаем новый массив для внешнего контейнера
int[][] deepCopy = new int[original.length][];

// 2. Клонируем каждый вложенный массив отдельно
for (int i = 0; i < original.length; i++) {
    deepCopy[i] = original[i].clone(); // или Arrays.copyOf(original[i], original[i].length)
}
// Теперь deepCopy — независимая копия.

Важные нюансы:

  • Для массивов объектов (String[][], MyClass[][]) приведенный выше метод скопирует только массивы первого уровня, но сами объекты внутри них будут общими (поверхностная копия на втором уровне). Для полного глубокого копирования объектов нужен обход всех элементов.
  • Альтернативные методы глубокого копирования:
    • Сериализация/десериализация (если объекты Serializable).
    • Рекурсивное копирование с использованием библиотек (например, Apache Commons Lang SerializationUtils.clone()).

Вывод: Всегда клонируйте вложенные массивы явно в цикле.

Ответ 18+ 🔞

А, ну ты смотри, какой умный решил двумерный массив скопировать! Думал, clone() или Arrays.copyOf() тебе всё сделают? Не, дружок, тут тебе не шахматы, тут надо головой думать, а не пальцами по клавишам стучать.

Эти методы, они как хитрая жопа — сверху вроде новое, а внутри всё те же старые ссылки на вложенные массивы торчат. Это называется поверхностное копирование, и оно тебя в просак заведёт, если ты хочешь именно независимую копию, а не кучу проблем.

Вот смотри, для примитивов типа int[][] делается так, блядь:

int[][] original = {{1, 2}, {3, 4}};

// 1. Создаем новый массив для внешнего контейнера
int[][] deepCopy = new int[original.length][];

// 2. Клонируем каждый вложенный массив отдельно
for (int i = 0; i < original.length; i++) {
    deepCopy[i] = original[i].clone(); // или Arrays.copyOf(original[i], original[i].length)
}
// Теперь deepCopy — независимая копия.

Вот теперь deepCopy — это твой личный, отдельный мир. Меняй его, не меняй, оригиналу будет похуй.

Но, ёпта, это ещё цветочки! Если у тебя там не примитивы, а объекты, например, String[][] или твои собственные классы, то тут начинается настоящий пиздец. Метод выше скопирует только массивы первого уровня, а сами объекты внутри них будут общими, как последняя сигарета на двоих. Это уже поверхностная копия на втором уровне, и доверия к ней — ебать ноль.

Для полного, тотального, глубокого копирования объектов тебе надо либо всё это хозяйство рекурсивно обходить и клонировать каждый чих, либо использовать тяжёлую артиллерию:

  • Сериализацию с десериализацией (если объекты, конечно, Serializable, а то опять обосрёшься).
  • Готовые библиотечные утилиты, вроде SerializationUtils.clone() из Apache Commons Lang.

Так что вывод, чувак, простой, как три копейки: не ленись, клонируй вложенные массивы явно, в цикле. И тогда у тебя не будет ситуации, когда ты думаешь, что поменял копию, а на самом деле ебнул оригинал.