Автор оригинала: Pankaj Kumar.
Сегодня мы рассмотрим различные способы копирования массива java. Java предоставляет встроенные методы для копирования массива. Независимо от того, хотите ли вы полную копию или частичную копию массива, вы можете легко сделать это с помощью встроенных классов java.
Массив копирования Java
Существует множество способов копирования массива в java. Давайте рассмотрим их по очереди.
Object.clone()
: Класс объектов предоставляет методclone ()
, и поскольку массив в java также является объектом, вы можете использовать этот метод для достижения полной копии массива. Этот метод вам не подойдет, если вы хотите получить частичную копию массива.System.arraycopy()
: Система классarraycopy ()
– лучший способ сделать частичную копию массива. Он предоставляет вам простой способ указать общее количество элементов для копирования, а также позиции индекса исходного и целевого массива. НапримерSystem.arraycopy(источник, 3, пункт назначения, 2, 5)
скопирует 5 элементов из источника в пункт назначения, начиная с 3-го индекса источника до 2-го индекса пункта назначения.Arrays.copyOf()
: Если вы хотите скопировать первые несколько элементов массива или полную копию массива, вы можете использовать этот метод. Очевидно, что он не универсален, какSystem.arraycopy ()
, но он также не сбивает с толку и прост в использовании. Этот метод внутренне использует системный метод arraycopy ().Arrays.copyOfRange()
: Если вы хотите скопировать несколько элементов массива, где начальный индекс не равен 0, вы можете использовать этот метод для копирования частичного массива. Опять же, этот метод также использует сам метод системного arraycopy.
Итак, это четыре наиболее полезных метода для полного и частичного копирования массива. Обратите внимание, что все эти встроенные методы предназначены только для копирования одномерных массивов.
Пример массива копирования Java
Теперь давайте посмотрим на эти методы копирования массива java в действии с помощью простой программы java.
package com.journaldev.util; import java.util.Arrays; public class JavaArrayCopyExample { /** * This class shows different methods for copy array in java * @param args */ public static void main(String[] args) { int[] source = {1,2,3,4,5,6,7,8,9}; int[] source1 = {1,2,3}; int[] destination=null; System.out.println("Source array = "+Arrays.toString(source)); destination = copyFirstFiveFieldsOfArrayUsingSystem(source); System.out.println("Copy First five elements of array if available. Result array = "+Arrays.toString(destination)); destination = copyFirstFiveFieldsOfArrayUsingSystem(source1); System.out.println("Copy First five elements of array if available. Result array = "+Arrays.toString(destination)); destination = copyFullArrayUsingSystem(source); System.out.println("Copy full array using System.copyarray() function. Result array = "+Arrays.toString(destination)); destination = copyFullArrayUsingClone(source); System.out.println("Copy full array using clone() function. Result array = "+Arrays.toString(destination)); destination = copyFullArrayUsingArrayCopyOf(source); System.out.println("Copy full array using Arrays.copyOf() function. Result array = "+Arrays.toString(destination)); destination = copyLastThreeUsingArrayCopyOfRange(source); System.out.println("Copy last three elements using Arrays.copyOfRange() function. Result array = "+Arrays.toString(destination)); } /** * This method copy full array using Arrays.copyOf() function * @param source * @return */ private static int[] copyFullArrayUsingArrayCopyOf(int[] source) { return Arrays.copyOf(source, source.length); } /** * This method copy partial array (last 3 elements) using * Arrays.copyOfRange() function * @param source * @return */ private static int[] copyLastThreeUsingArrayCopyOfRange(int[] source) { //length check is necessary to avoid java.lang.ArrayIndexOutOfBoundsException //but for simplicity I am not doing that return Arrays.copyOfRange(source, source.length-3, source.length); } /** * This method copy full array using clone() function * @param source * @return */ private static int[] copyFullArrayUsingClone(int[] source) { return source.clone(); } /** * This method copy full array using System.arraycopy() function * @param source * @return */ private static int[] copyFullArrayUsingSystem(int[] source) { int[] temp=new int[source.length]; System.arraycopy(source, 0, temp, 0, source.length); return temp; } /** * This method copy full first five elements of array * using System.arraycopy() function * @param source * @return */ private static int[] copyFirstFiveFieldsOfArrayUsingSystem(int[] source) { if(source.length > 5){ int[] temp=new int[5]; System.arraycopy(source, 0, temp, 0, 5); return temp; }else{ int[] temp=new int[source.length]; System.arraycopy(source, 0, temp, 0, source.length); return temp; } } }
Результатом работы вышеуказанной программы является:
Source array = [1, 2, 3, 4, 5, 6, 7, 8, 9] Copy First five elements of array if available. Result array = [1, 2, 3, 4, 5] Copy First five elements of array if available. Result array = [1, 2, 3] Copy full array using System.copyarray() function. Result array = [1, 2, 3, 4, 5, 6, 7, 8, 9] Copy full array using clone() function. Result array = [1, 2, 3, 4, 5, 6, 7, 8, 9] Copy full array using Arrays.copyOf() function. Result array = [1, 2, 3, 4, 5, 6, 7, 8, 9] Copy last three elements using Arrays.copyOfRange() function. Result array = [7, 8, 9]
Копирование Массива Java – Неглубокое Копирование
Обратите внимание, что все встроенные методы, описанные выше для копирования массива, выполняют неглубокое копирование, поэтому они хороши для примитивных типов данных и неизменяемых объектов, таких как строка. Если вы хотите скопировать массив изменяемых объектов, вам следует сделать это самостоятельно, написав код для глубокой копии. Ниже приведена программа, показывающая проблему с методами неглубокого копирования.
import java.util.Arrays; public class JavaArrayCopyMutableObjects { public static void main(String[] args) { Employee e = new Employee("Pankaj"); Employee[] empArray1 = {e}; Employee[] empArray2 = new Employee[empArray1.length]; System.arraycopy(empArray1, 0, empArray2, 0, empArray1.length); System.out.println("empArray1 = "+Arrays.toString(empArray1)); System.out.println("empArray2 = "+Arrays.toString(empArray2)); //Let's change empArray1 empArray1[0].setName("David"); System.out.println("empArray1 = "+Arrays.toString(empArray1)); System.out.println("empArray2 = "+Arrays.toString(empArray2)); } } class Employee { private String name; public Employee(String n) { this.name = n; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return this.name; } }
Теперь, когда мы запускаем вышеприведенную программу, ниже приведен результат.
empArray1 = [Pankaj] empArray2 = [Pankaj] empArray1 = [David] empArray2 = [David]
Как вы можете видеть, temparray2
тоже изменился, хотя это никогда не было намерением. Это может вызвать серьезные проблемы в вашем приложении, поэтому вам лучше написать свой собственный код для глубокого копирования массива. Аналогичный случай имеет место для метода клонирования объекта java .
Ниже приведен код для полной копии массива, который будет использоваться в этом случае. Вы можете легко написать что – то подобное для частичного копирования массива.
import java.util.Arrays; public class JavaArrayCopyMutableObjects { public static void main(String[] args) { Employee e = new Employee("Pankaj"); Employee[] empArray1 = {e}; Employee[] empArray2 = fullCopy(empArray1); System.out.println("empArray1 = "+Arrays.toString(empArray1)); System.out.println("empArray2 = "+Arrays.toString(empArray2)); //Let's change empArray1 empArray1[0].setName("David"); System.out.println("empArray1 = "+Arrays.toString(empArray1)); System.out.println("empArray2 = "+Arrays.toString(empArray2)); } private static Employee[] fullCopy(Employee[] source) { Employee[] destination = new Employee[source.length]; for(int i=0; i< source.length; i++) { Employee e = source[i]; Employee temp = new Employee(e.getName()); destination[i] = temp; } return destination; } } class Employee { private String name; public Employee(String n) { this.name = n; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return this.name; } }
Теперь, когда мы запускаем вышеприведенную программу, полученный результат:
empArray1 = [Pankaj] empArray2 = [Pankaj] empArray1 = [David] empArray2 = [Pankaj]
Как вы можете видеть, в глубокой копии наши исходные и целевые элементы массива ссылаются на разные объекты. Таким образом, они полностью отделены, и если мы изменим один из них, другой останется незатронутым.
Это все для массива копирования java и того, как правильно выполнять копирование массива в программах java.