Научитесь создавать копию массива в Java. Мы научимся делать поверхностное и глубокое копирование массива с помощью простых примеров.
1. Создание поверхностной копии массива
При поверхностном копировании ссылки на элементы массива копируются в новый массив, поэтому любые изменения в массиве или элементах массива видны в клонированном скопированном массиве. Метод array.clone() создает поверхностную копию.

Давайте рассмотрим несколько методов создания поверхностных копий массива в Java.
1.1 Использование метода Object.clone()
В Java для создания клона массива следует использовать array.clone(). Он создает поверхностную копию массива. Клонирование по умолчанию всегда создает поверхностную копию массива. Любое изменение(в исходном массиве) также будет отражено в клонированном массиве.
Employee[] clonedArray = empArray.clone();
Давайте рассмотрим пример. Когда мы вносим изменения в элементы empArray, элементы в clonedArray также изменяются.
Employee[] empArr = new Employee[2]; //Original arrayempArr[0] = new Employee(100, "Lokesh", "Gupta", new Department(1, "HR"));empArr[1] = new Employee(200, "Pankaj", "Kumar", new Department(2, "Finance"));Employee[] clonedArray = empArray.clone(); //Shallow copied arrayempArray[0].setFirstName("Unknown");empArray[0].getDepartment().setName("Unknown");System.out.println(empArray[0].getFirstName()); //UnknownSystem.out.println(empArray[0].getDepartment().getName()); //UnknownSystem.out.println(clonedArray[0].getFirstName()); //UnknownSystem.out.println(clonedArray[0].getDepartment().getName()); //Unknown
1.2 Использование Arrays.copyOf()
Метод Arrays.copyOf(array, newLength) копирует указанный массив, усекая или дополняя его значениями по умолчанию, поэтому массив копий имеет указанную newLength.
Метод copyOf() является перегруженным, поэтому значение по умолчанию, которое должно быть заполнено в пустых местах, зависит от типа элементов в массиве. Например, массив boolean будет заполнен значением false, а массив int будет заполнен значением 0. Типы объектов будут заполнены значениями null.
Employee[] empArr = new Employee[2];Employee[] copiedArray = Arrays.copyOf(empArray, empArr.length);
1.3 Использование System.arraycopy()
Еще один полезный метод, предоставляемый JDK. Это собственный метод, который также вызывается внутри метода Arrays.copyOf(), внутренне. Но он делает код немного менее читабельным из-за множественных аргументов, используемых для вызова.
Метод arraycopy() копирует элементы из srcArray(начальная позиция srcPos) в destArray(начальная позиция destPos). Количество копируемых элементов указывается с помощью аргумента length.
public static native void arraycopy(Object srcArray, int srcPos, Object destArray, int destPos, int length);
В следующем примере все элементы из массива names копируются в массив copyOfNames, начиная с нулевой позиции в обоих массивах.
String[] names = {"Alex", "Brian", "Charles", "David"};String[] copyOfNames = new String[names.length];System.arraycopy(names, 0, copyOfNames, 0, copyOfNames.length);System.out.println(Arrays.toString(names)); //[Alex, Brian, Charles, David]System.out.println(Arrays.toString(copyOfNames)); //[Alex, Brian, Charles, David]
2. Создание глубокой копии массива
При глубоком копировании создаются новые экземпляры элементов массива, поэтому любые изменения в исходном массиве не отражаются на скопированном массиве. Сериализация в памяти — это сокращенный подход к созданию глубоких копий объекта в Java.

Если вы хотите создать глубокую копию массива в Java, то используйте метод Apache Common SerializationUtils.clone( array).
Employee[] copiedArray = SerializationUtils.clone(empArray); //Deep copied array
Давайте проверим это на примере.
Employee[] empArray = new Employee[2];empArray[0] = new Employee(100, "Lokesh", "Gupta", new Department(1, "HR"));empArray[1] = new Employee(200, "Pankaj", "Kumar", new Department(2, "Finance"));Employee[] copiedArray = SerializationUtils.clone(empArray); //Deep copied arrayempArray[0].setFirstName("Unknown");empArray[0].getDepartment().setName("Unknown");//Verify the change in original array - "CHANGED"System.out.println(empArray[0].getFirstName()); //UnknownSystem.out.println(empArray[0].getDepartment().getName()); //Unknown//Verify the change in deep copied array - "UNCHANGED"System.out.println(copiedArray[0].getFirstName()); //LokeshSystem.out.println(copiedArray[0].getDepartment().getName()); //HR