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

Примеры методов Java System.arraycopy()

Java System.arraycopy () – это собственный статический метод для копирования элементов из исходного массива в целевой массив. Аргументы Метода System.arraycopy()

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

Java System.arraycopy () – это собственный статический метод для копирования элементов из исходного массива в целевой массив.

Аргументы метода System.arraycopy()

Сигнатура метода System.arraycopy() является:

public static native void arraycopy(Object src,  int  srcPos,
     Object dest, int destPos,
     int length);
  • src : исходный массив.
  • srcPos : индекс исходного массива, с которого начнется копирование
  • dest : массив назначения.
  • destPos : индекс массива назначения, из которого будут скопированы данные.
  • длина : количество элементов для копирования.

Пример Java System.arraycopy()

Давайте рассмотрим простой пример копирования массива с помощью этого метода.

package com.journaldev.examples;

import java.util.Arrays;

public class SystemArrayCopy {

	public static void main(String[] args) {
		int[] source = { 1, 2, 3, 4, 5, 6, 7 };
		int[] destination = new int[5];

		System.arraycopy(source, 3, destination, 2, 3);

		System.out.println(Arrays.toString(destination));
	}
}

Выход

Пример Java System.arraycopy()

Элементы из исходного массива для копирования равны 4,5,6. Они копируются в целевой массив, начиная с индекса 2.

System.arraycopy (), когда источник и назначение являются одним и тем же массивом

Если источником и назначением являются одни и те же массивы, из исходного массива создается временный массив. Затем элементы из временного массива копируются в исходный массив.

jshell> int[] source = { 1, 2, 3, 4, 5, 6, 7 };
source ==> int[7] { 1, 2, 3, 4, 5, 6, 7 }

jshell> System.arraycopy(source, 3, source, 5, 2);

jshell> System.out.println(Arrays.toString(source));
[1, 2, 3, 4, 5, 4, 5]

Сценарии исключений с помощью системного метода arraycopy()

Метод arraycopy() имеет 5 аргументов. Таким образом, существует множество случаев, когда может возникнуть исключение. Исключения, создаваемые этим методом, следующие:

  • Исключение NullPointerException : если исходный или целевой массив равен нулю.
  • Исключение ArrayStoreException : если тип массива источника и назначения не совпадает или они не являются массивом.
  • Исключение ArrayIndexOutOfBoundsException : если переполнение данных происходит из-за значений индекса или они отрицательные.

Давайте рассмотрим некоторые примеры этих сценариев исключений.

1. Примеры исключений NullPointerException

jshell> System.arraycopy(source, 3, null, 2, 3);
|  Exception java.lang.NullPointerException
|        at System.arraycopy (Native Method)
|        at (#4:1)

jshell> System.arraycopy(null, 3, source, 2, 3);
|  Exception java.lang.NullPointerException
|        at System.arraycopy (Native Method)
|        at (#5:1)

2. Исключение ArrayStoreException, когда источник и назначение не являются массивом

jshell> System.arraycopy(new Object(), 3, source, 2, 3);
|  Exception java.lang.ArrayStoreException: arraycopy: source type java.lang.Object is not an array
|        at System.arraycopy (Native Method)
|        at (#6:1)

jshell> System.arraycopy(source, 3, "ABC", 2, 3);
|  Exception java.lang.ArrayStoreException: arraycopy: destination type java.lang.String is not an array
|        at System.arraycopy (Native Method)
|        at (#7:1)

3. Исключение ArrayStoreException, когда массивы источника и назначения несовместимы

jshell> int[] source = {1, 2, 3}
source ==> int[3] { 1, 2, 3 }

jshell> String[] destination = new String[5];
destination ==> String[5] { null, null, null, null, null }

jshell> System.arraycopy(source, 0, destination, 0, 2);
|  Exception java.lang.ArrayStoreException: arraycopy: type mismatch: can not copy int[] into object array[]
|        at System.arraycopy (Native Method)
|        at (#10:1)

4. Исключение ArrayIndexOutOfBoundsException, когда индекс или длина отрицательны

jshell> int[] source = {1, 2, 3}
source ==> int[3] { 1, 2, 3 }

jshell> int[] dest = new int[5];
dest ==> int[5] { 0, 0, 0, 0, 0 }

jshell> System.arraycopy(source, -1, dest, 0, 2);
|  Exception java.lang.ArrayIndexOutOfBoundsException: arraycopy: source index -1 out of bounds for int[3]
|        at System.arraycopy (Native Method)
|        at (#15:1)

jshell> System.arraycopy(source, 1, dest, -1, 2);
|  Exception java.lang.ArrayIndexOutOfBoundsException: arraycopy: destination index -1 out of bounds for int[5]
|        at System.arraycopy (Native Method)
|        at (#16:1)

jshell> System.arraycopy(source, 1, dest, 0, -2);
|  Exception java.lang.ArrayIndexOutOfBoundsException: arraycopy: length -2 is negative
|        at System.arraycopy (Native Method)
|        at (#17:1) 

5. Исключение ArrayIndexOutOfBoundsException, когда srcPos+длина больше, чем src.длина

jshell> System.arraycopy(source, 0, dest, 0, 4);
|  Exception java.lang.ArrayIndexOutOfBoundsException: arraycopy: last source index 4 out of bounds for int[3]
|        at System.arraycopy (Native Method)
|        at (#18:1)

6. Исключение ArrayIndexOutOfBoundsException, когда destPos+длина больше, чем dest.длина

jshell> int[] src = {1, 2, 3, 4}
src ==> int[4] { 1, 2, 3, 4 }

jshell> int[] dest = new int[2]
dest ==> int[2] { 0, 0 }

jshell> System.arraycopy(src, 0, dest, 0, 3);
|  Exception java.lang.ArrayIndexOutOfBoundsException: arraycopy: last destination index 3 out of bounds for int[2]
|        at System.arraycopy (Native Method)
|        at (#21:1)

Вывод

Для копирования элементов массива можно использовать собственный метод Java System arraycopy (). Однако существует множество сценариев, которые могут привести к исключениям во время выполнения. Поэтому вам следует использовать его осторожно, когда вы знаете длину исходного и целевого массива.

Рекомендации