Перейти к основному содержимому

Увеличение длины массива

· 3 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим различные способы расширения массива Java .

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

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

Во-первых, давайте посмотрим на Arrays.copyOf . Мы скопируем массив и добавим в копию новый элемент:

public Integer[] addElementUsingArraysCopyOf(Integer[] srcArray, int elementToAdd) {
Integer[] destArray = Arrays.copyOf(srcArray, srcArray.length + 1);
destArray[destArray.length - 1] = elementToAdd;
return destArray;
}

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

Следует отметить, что когда аргумент длины больше размера исходного массива, Arrays.copyOf заполнит дополнительные элементы в целевом массиве нулевым значением .

В зависимости от типа данных поведение заливки будет разным. Например, если мы используем примитивные типы данных вместо Integer , то лишние элементы заполняются нулями. В случае char Arrays.copyOf заполнит дополнительные элементы нулевым значением , а в случае логического значения — ложным . ``

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

Следующий способ, который мы рассмотрим, — это использование ArrayList.

Сначала мы преобразуем массив в ArrayList , а затем добавим элемент. Затем мы преобразуем ArrayList обратно в массив :

public Integer[] addElementUsingArrayList(Integer[] srcArray, int elementToAdd) {
Integer[] destArray = new Integer[srcArray.length + 1];
ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(srcArray));
arrayList.add(elementToAdd);
return arrayList.toArray(destArray);
}

Обратите внимание, что мы передали srcArray , преобразовав его в коллекцию. srcArray заполнит базовый массив в ArrayList .

Кроме того, следует отметить, что мы передали целевой массив в качестве аргумента toArray . Этот метод скопирует базовый массив в destArray .

4. Использование System.arraycopy

Наконец, мы рассмотрим System.arraycopy , который очень похож на Arrays.copyOf :

public Integer[] addElementUsingSystemArrayCopy(Integer[] srcArray, int elementToAdd) {
Integer[] destArray = new Integer[srcArray.length + 1];
System.arraycopy(srcArray, 0, destArray, 0, srcArray.length);
destArray[destArray.length - 1] = elementToAdd;
return destArray;
}

Один интересный факт заключается в том, что Arrays.copyOf внутренне использует этот метод.

Здесь мы можем заметить, что мы копируем элементы из srcArray в destArray , а затем добавляем новый элемент в destArray .

5. Производительность

Одна общая черта во всех решениях заключается в том, что мы должны так или иначе создать новый массив. Причина этого кроется в том, как массивы распределяются в памяти. Массив содержит непрерывный блок памяти для сверхбыстрого поиска, поэтому мы не можем просто изменить его размер.

Это, конечно, влияет на производительность, особенно для больших массивов. Вот почему ArrayList перераспределяет память, эффективно уменьшая количество раз, которое JVM требуется для перераспределения памяти.

Но если мы делаем много вставок, массив может быть не правильной структурой данных, и нам следует рассмотреть LinkedList .

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

В этой статье мы рассмотрели различные способы добавления элементов в конец массива.

И, как всегда, весь код доступен на GitHub .