Массивы — это структуры данных фиксированного размера, и размеры массивов не могут быть изменены после их инициализации. Однако в случаях, когда необходимо изменить размер массива, мы должны следовать одному из подходов, приведенных в этом руководстве.
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 мы не осуществляем явное управление памятью, поэтому сборщик мусора заботится о старом массиве и освобождает память, когда она подходит.