Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как скопировать массив

Короткий ответ

clone() или Arrays.copyOf() создают новый массив с теми же элементами:

void main() {
    int[] original = {1, 2, 3};
    int[] copy = original.clone();
    copy[0] = 99;
 
    IO.println(Arrays.toString(original));
    IO.println(Arrays.toString(copy));
}

Результат:

[1, 2, 3]
[99, 2, 3]

Другой длины

Arrays.copyOf() позволяет сразу изменить длину — новые элементы заполняются нулями:

void main() {
    int[] numbers = {1, 2, 3};
 
    IO.println(Arrays.toString(Arrays.copyOf(numbers, 5)));
    IO.println(Arrays.toString(Arrays.copyOf(numbers, 2)));
}

Результат:

[1, 2, 3, 0, 0]
[1, 2]

Часть массива

Arrays.copyOfRange() копирует элементы с индекса from до to (не включая):

void main() {
    String[] days = {"Mon", "Tue", "Wed", "Thu", "Fri"};
    IO.println(Arrays.toString(Arrays.copyOfRange(days, 1, 4)));
}

Результат:

[Tue, Wed, Thu]

В существующий массив

System.arraycopy() копирует часть одного массива в другой:

void main() {
    int[] source = {1, 2, 3};
    int[] target = new int[5];
    System.arraycopy(source, 0, target, 2, 3);
 
    IO.println(Arrays.toString(target));
}

Результат:

[0, 0, 1, 2, 3]

Частая ошибка

Присвоить массив другой переменной и считать это копией. Обе переменные указывают на один массив:

void main() {
    int[] original = {1, 2, 3};
    int[] notACopy = original;
    notACopy[0] = 99;
 
    IO.println(Arrays.toString(original));
}

Результат:

[99, 2, 3]

Учтите и другое: clone() копирует только сам массив. Если в нём лежат изменяемые объекты, копия ссылается на те же объекты.

Функции из этого ответа

  • Arrays.copyOf() — Копирует массив в новый — той же или другой длины. Часть массива копирует copyOfRange().

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.