Рубрики
Без рубрики

Массив копирования Java, Копирование массива в Java, Java ArrayCopy, Системный метод arraycopy, Arrays.copyOf, Массивы.copyOfRange, проглотить копию, массив глубокого копирования пример кода

Массив копирования Java, Копирование массива в Java, Java ArrayCopy, Системный метод arraycopy, Arrays.copyOf, Массивы.copyOfRange, проглотить копию, массив глубокого копирования пример кода

Автор оригинала: Pankaj Kumar.

Сегодня мы рассмотрим различные способы копирования массива java. Java предоставляет встроенные методы для копирования массива. Независимо от того, хотите ли вы полную копию или частичную копию массива, вы можете легко сделать это с помощью встроенных классов java.

Массив копирования Java

Существует множество способов копирования массива в java. Давайте рассмотрим их по очереди.

  1. Object.clone() : Класс объектов предоставляет метод clone () , и поскольку массив в java также является объектом, вы можете использовать этот метод для достижения полной копии массива. Этот метод вам не подойдет, если вы хотите получить частичную копию массива.
  2. System.arraycopy() : Система класс arraycopy () – лучший способ сделать частичную копию массива. Он предоставляет вам простой способ указать общее количество элементов для копирования, а также позиции индекса исходного и целевого массива. Например System.arraycopy(источник, 3, пункт назначения, 2, 5) скопирует 5 элементов из источника в пункт назначения, начиная с 3-го индекса источника до 2-го индекса пункта назначения.
  3. Arrays.copyOf() : Если вы хотите скопировать первые несколько элементов массива или полную копию массива, вы можете использовать этот метод. Очевидно, что он не универсален, как System.arraycopy () , но он также не сбивает с толку и прост в использовании. Этот метод внутренне использует системный метод arraycopy ().
  4. 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.

Ссылка: Документация по arraycopy системного класса