Изменение размера массивов в Java

Массивы — это структуры данных фиксированного размера, и размеры массивов не могут быть изменены после их инициализации. Однако в случаях, когда необходимо изменить размер массива, мы должны следовать одному из подходов, приведенных в этом руководстве.

1. Использование java.util.Arrays.copyOf()

Метод copyOf(originalArray, newLength) принимает массив и новую длину массива. Метод copyOf() создает новый массив требуемого newLength и копирует originalArray в новый массив с помощью функции System.arraycopy().

Если новый массив меньше по размеру, то copyOf() усекает оставшиеся элементы; в противном случае, если новый массив больше по размеру, то он дополняет оставшиеся индексы нулями. Результирующий массив имеет точно такой же тип, как и исходный массив.

Обратите внимание, что метод copyOf() изменяет размер только одномерного массива. Для изменения размера многомерных массивов нет универсального решения, и нам нужно предоставить собственную логику.

String[] originalArray = {"A", "B", "C", "D", "E"};String[] resizedArray = Arrays.copyOf(originalArray, 10);resizedArray[5] = "F";System.out.println(Arrays.toString(resizedArray));//[A, B, C, D, E, F, null, null, null, null]

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

2. Использование ArrayList

Другой подход — еще раз подумать о вашем дизайне. Если ArrayList лучше подходит для такого варианта использования, то рассмотрите возможность использования List вместо массива.

Списки уже поддерживают динамическое изменение размера, допускают доступ на основе индекса и обеспечивают отличную производительность.

String[] originalArray = {"A", "B", "C", "D", "E"};ArrayList<String> list = new ArrayList<>(Arrays.asList(originalArray));list.add("F");System.out.println(list);//[A, B, C, D, E, F]

3. Заключение

Изменение размера массивов в Java ничем не отличается от любого другого языка программирования. Процесс изменения размера выделяет новый массив с указанным размером, копирует элементы из старого массива в новый, а затем заменяет старый массив новым.

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

Исходный код на Github

Прокрутить вверх