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 По умолчанию
Listlist = new ArrayList<>(); assertTrue(list.isEmpty());
Мы просто создаем пустую ArrayList экземпляр.
2.2. Конструктор, Принимающий Начальную Мощность
Listlist = new ArrayList<>(20);
Здесь указывается начальная длина базового массива. Это может помочь вам избежать ненужного изменения размера при добавлении новых элементов.
2.3. Конструктор, принимающий Коллекцию
Collectionnumber = IntStream.range(0, 10).boxed().collect(toSet()); List list = new ArrayList<>(numbers); assertEquals(10, list.size()); assertTrue(numbers.containsAll(list));
Обратите внимание, что элемент экземпляра Collection используется для заполнения базового массива.
3. Добавьте элементы в список ArrayList
Вы можете вставить элемент либо в конце, либо в определенной позиции:
Listlist = new ArrayList<>(); list.add(1L); list.add(2L); list.add(1, 3L); assertThat(Arrays.asList(1L, 3L, 2L), equalTo(list));
Вы также можете вставить коллекцию или несколько элементов одновременно:
Listlist = 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 :
Listlist = 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
Мы продемонстрируем, как работает поиск с использованием коллекции:
Listlist = 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 (подробнее об этом здесь ), используя Предикат , как это:
SetmatchingStrings = new HashSet<>(Arrays.asList("a", "c", "9")); List result = stringsToSearch .stream() .filter(matchingStrings::contains) .collect(toCollection(ArrayList::new)); assertEquals(6, result.size());
Также можно использовать цикл for или итератор:
Iteratorit = 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. Поиск по отсортированному списку
Если у вас есть отсортированный массив, вы можете использовать алгоритм бинарного поиска, который работает быстрее, чем линейный поиск:
Listcopy = new ArrayList<>(stringsToSearch); Collections.sort(copy); int index = Collections.binarySearch(copy, "f"); assertThat(index, not(equalTo(-1)));
Обратите внимание, что если элемент не найден, то будет возвращен -1.
6. Удалите элементы из списка ArrayList
Чтобы удалить элемент, вы должны найти его индекс и только затем выполнить удаление с помощью метода remove () . Перегруженная версия этого метода, которая принимает объект, ищет его и выполняет удаление первого вхождения равного элемента:
Listlist = 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 для удаления нескольких элементов, но мы не будем показывать его здесь. Для этого мы будем использовать итератор:
SetmatchingStrings = 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 .