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

Добавление элемента в массив Java по сравнению с ArrayList

Узнайте, как добавить элемент в массив Java по сравнению с ArrayList

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

1. Обзор

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

2. Массивы Java и ArrayList

Массив Java – это базовая структура данных, предоставляемая языком. В отличие от этого, ArrayList является реализацией интерфейса List , поддерживаемого массивом, и предоставляется в рамках коллекций Java.

2.1. Доступ к элементам и их изменение

Мы можем получить доступ к элементам массива и изменить их, используя обозначения в квадратных скобках:

System.out.println(anArray[1]);
anArray[1] = 4;

С другой стороны, ArrayList имеет набор методов для доступа и изменения элементов:

int n = anArrayList.get(1);
anArrayList.set(1, 4);

2.2. Фиксированный и динамический размер

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

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

ArrayList — это реализация изменяемого размера массива интерфейса List , то есть ArrayList динамически растет по мере добавления в него элементов. Когда количество текущих элементов (включая новый элемент, добавляемый в ArrayList ), превышает максимальный размер базового массива, то ArrayList увеличивает размер базового массива.

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

Операция добавления имеет постоянную амортизированную временную стоимость. Другими словами, добавление n элементов в ArrayList требует O(n) времени.

2.3. Типы элементов

Массив может содержать как примитивные, так и непримитивные типы данных, в зависимости от определения массива. Однако an ArrayList может содержать только непримитивные типы данных .

Когда мы вставляем элементы с примитивными типами данных в ArrayList , компилятор Java автоматически преобразует примитивный тип данных в соответствующий класс-оболочку объекта.

Теперь давайте рассмотрим, как добавлять и вставлять элементы в массивы Java и ArrayList .

3. Добавление элемента

Как мы уже видели, массивы имеют фиксированный размер.

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

Давайте рассмотрим его реализацию в Java без использования каких-либо служебных классов:

public Integer[] addElementUsingPureJava(Integer[] srcArray, int elementToAdd) {
    Integer[] destArray = new Integer[srcArray.length+1];

    for(int i = 0; i < srcArray.length; i++) {
        destArray[i] = srcArray[i];
    }

    destArray[destArray.length - 1] = elementToAdd;
    return destArray;
}

Кроме того, класс Arrays предоставляет служебный метод copyOf() , который помогает создать новый массив большего размера и скопировать все элементы из старого массива:

int[] destArray = Arrays.copyOf(srcArray, srcArray.length + 1);

После того, как мы создали новый массив, мы можем легко добавить новый элемент в массив:

destArray[destArray.length - 1] = elementToAdd;

С другой стороны, добавление элемента в ArrayList довольно просто :

anArrayList.add(newElement);

4. Вставка элемента в индекс

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

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

Кроме того, нам нужно сдвинуть все элементы, которые идут после указанного индекса, на одну позицию вправо:

public static int[] insertAnElementAtAGivenIndex(final int[] srcArray, int index, int newElement) {
    int[] destArray = new int[srcArray.length+1];
    int j = 0;
    for(int i = 0; i < destArray.length-1; i++) {

        if(i == index) {
            destArray[i] = newElement;
        } else {
            destArray[i] = srcArray[j];
            j++;
        }
    }
    return destArray;
}

Однако класс ArrayUtils дает нам более простое решение для вставки элементов в массив :

int[] destArray = ArrayUtils.insert(2, srcArray, 77);

Мы должны указать индекс, в который мы хотим вставить значение, исходный массив и значение для вставки.

Метод insert() возвращает новый массив, содержащий большее количество элементов, при этом новый элемент имеет указанный индекс, а все остальные элементы сдвинуты на одну позицию вправо.

Обратите внимание, что последний аргумент метода insert() является переменным аргументом, поэтому мы можем вставить любое количество элементов в массив.

Давайте используем его для вставки трех элементов в массив src , начиная с индекса два:

int[] destArray = ArrayUtils.insert(2, srcArray, 77, 88, 99);

А остальные элементы будут сдвинуты на три места вправо.

Кроме того, это может быть достигнуто тривиально для ArrayList :

anArrayList.add(index, newElement);

ArrayList сдвигает элементы и вставляет элемент в нужное место.

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

В этой статье мы рассмотрели массив Java и ArrayList . Кроме того, мы рассмотрели сходства и различия между ними. Наконец, мы увидели, как добавлять и вставлять элементы в массив и ArrayList .

Как всегда, полный исходный код рабочих примеров доступен на GitHub .