Ответ
Клонирование двумерного массива требует глубокого копирования, так как 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.
Так что вывод, чувак, простой, как три копейки: не ленись, клонируй вложенные массивы явно, в цикле. И тогда у тебя не будет ситуации, когда ты думаешь, что поменял копию, а на самом деле ебнул оригинал.