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

Руководство по Java ArrayList

Краткое и практическое руководство по ArrayList на Java

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

1. Обзор

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

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

import java.util.ArrayList;

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

ArrayList – это одна из реализаций List , построенная поверх массива, которая способна динамически расти и сжиматься по мере добавления/удаления элементов. Элементы могут быть легко доступны по их индексам, начиная с нуля. Эта реализация имеет следующие свойства:

  • Произвольный доступ занимает O(1) время
  • Добавление элемента занимает амортизированное постоянное время O(1)
  • Вставка/Удаление занимает O(n) время
  • Поиск занимает O(n) время для несортированного массива и O(log n) для отсортированного

2. Создайте список ArrayList

ArrayList имеет несколько конструкторов, и мы представим их все в этом разделе.

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

Во-вторых, рекомендуется использовать универсальный интерфейс List в качестве типа переменной, поскольку он отделяет его от конкретной реализации.

2.1. Конструктор No-Arg По умолчанию

List list = new ArrayList<>();
assertTrue(list.isEmpty());

Мы просто создаем пустую ArrayList экземпляр.

2.2. Конструктор, Принимающий Начальную Мощность

List list = new ArrayList<>(20);

Здесь указывается начальная длина базового массива. Это может помочь вам избежать ненужного изменения размера при добавлении новых элементов.

2.3. Конструктор, принимающий Коллекцию

Collection number 
  = IntStream.range(0, 10).boxed().collect(toSet());

List list = new ArrayList<>(numbers);
assertEquals(10, list.size());
assertTrue(numbers.containsAll(list));

Обратите внимание, что элемент экземпляра Collection используется для заполнения базового массива.

3. Добавьте элементы в список ArrayList

Вы можете вставить элемент либо в конце, либо в определенной позиции:

List list = new ArrayList<>();

list.add(1L);
list.add(2L);
list.add(1, 3L);

assertThat(Arrays.asList(1L, 3L, 2L), equalTo(list));

Вы также можете вставить коллекцию или несколько элементов одновременно:

List list = new ArrayList<>(Arrays.asList(1L, 2L, 3L));
LongStream.range(4, 10).boxed()
  .collect(collectingAndThen(toCollection(ArrayList::new), ys -> list.addAll(0, ys)));
assertThat(Arrays.asList(4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L), equalTo(list));

4. Выполните итерацию по списку ArrayList

Существует два типа итераторов: Iterator и ListIterator .

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

Здесь мы покажем вам только ListIterator :

List list = new ArrayList<>(
  IntStream.range(0, 10).boxed().collect(toCollection(ArrayList::new))
);
ListIterator it = list.listIterator(list.size());
List result = new ArrayList<>(list.size());
while (it.hasPrevious()) {
    result.add(it.previous());
}

Collections.reverse(list);
assertThat(result, equalTo(list));

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

5. Выполните поиск в списке ArrayList

Мы продемонстрируем, как работает поиск с использованием коллекции:

List list = LongStream.range(0, 16)
  .boxed()
  .map(Long::toHexString)
  .collect(toCollection(ArrayList::new));
List stringsToSearch = new ArrayList<>(list);
stringsToSearch.addAll(list);

5.1. Поиск в несортированном списке

Чтобы найти элемент, вы можете использовать методы indexOf() или lastIndexOf () . Они оба принимают объект и возвращают его значение:

assertEquals(10, stringsToSearch.indexOf("a"));
assertEquals(26, stringsToSearch.lastIndexOf("a"));

Если вы хотите найти все элементы, удовлетворяющие предикату, вы можете отфильтровать коллекцию с помощью Java 8 Stream API (подробнее об этом здесь ), используя Предикат , как это:

Set matchingStrings = new HashSet<>(Arrays.asList("a", "c", "9"));

List result = stringsToSearch
  .stream()
  .filter(matchingStrings::contains)
  .collect(toCollection(ArrayList::new));

assertEquals(6, result.size());

Также можно использовать цикл for или итератор:

Iterator it = stringsToSearch.iterator();
Set matchingStrings = new HashSet<>(Arrays.asList("a", "c", "9"));

List result = new ArrayList<>();
while (it.hasNext()) {
    String s = it.next();
    if (matchingStrings.contains(s)) {
        result.add(s);
    }
}

5.2. Поиск по отсортированному списку

Если у вас есть отсортированный массив, вы можете использовать алгоритм бинарного поиска, который работает быстрее, чем линейный поиск:

List copy = new ArrayList<>(stringsToSearch);
Collections.sort(copy);
int index = Collections.binarySearch(copy, "f");
assertThat(index, not(equalTo(-1)));

Обратите внимание, что если элемент не найден, то будет возвращен -1.

6. Удалите элементы из списка ArrayList

Чтобы удалить элемент, вы должны найти его индекс и только затем выполнить удаление с помощью метода remove () . Перегруженная версия этого метода, которая принимает объект, ищет его и выполняет удаление первого вхождения равного элемента:

List list = new ArrayList<>(
  IntStream.range(0, 10).boxed().collect(toCollection(ArrayList::new))
);
Collections.reverse(list);

list.remove(0);
assertThat(list.get(0), equalTo(8));

list.remove(Integer.valueOf(0));
assertFalse(list.contains(0));

Но будьте осторожны при работе с коробочными типами, такими как Integer . Для того, чтобы удалить конкретный элемент, вы должны сначала установить флажок int value, иначе элемент будет удален по его индексу.

Вы также можете использовать вышеупомянутый Stream API для удаления нескольких элементов, но мы не будем показывать его здесь. Для этого мы будем использовать итератор:

Set matchingStrings
 = HashSet<>(Arrays.asList("a", "b", "c", "d", "e", "f"));

Iterator it = stringsToSearch.iterator();
while (it.hasNext()) {
    if (matchingStrings.contains(it.next())) {
        it.remove();
    }
}

7. Резюме

В этой краткой статье мы рассмотрели ArrayList на Java.

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

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