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

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

1. Вступление

LinkedList - это реализация двусвязного списка интерфейсовList иDeque. Он реализует все необязательные операции со списком и разрешает все элементы (включаяnull).

2. Характеристики

Ниже вы можете найти наиболее важные свойстваLinkedList:

  • Операции, которые индексируют в списке, будут проходить по списку с начала или конца, в зависимости от того, что ближе к указанному индексу

  • Это неsynchronized

  • Его итераторыIterator иListIterator - этоfail-fast (что означает, что после создания итератора, если список будет изменен, будет брошенConcurrentModificationException)

  • Каждый элемент является узлом, который хранит ссылку на следующий и предыдущий

  • Поддерживает порядок вставки

ХотяLinkedList не синхронизирован, мы можем получить его синхронизированную версию, вызвав методCollections.synchronizedList, например:

List list = Collections.synchronizedList(new LinkedList(...));

3. Сравнение сArrayList

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

3.1. Состав

ArrayList - это структура данных на основе индекса, поддерживаемаяArray. Он обеспечивает произвольный доступ к своим элементам с производительностью, равной O (1).

С другой стороны,LinkedList хранит свои данные в виде списка элементов, и каждый элемент связан со своим предыдущим и следующим элементом. В этом случае операция поиска элемента имеет время выполнения, равное O (n).

3.2. операции

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

3.3. Использование памяти

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

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

Вот несколько примеров кода, которые показывают, как можно использоватьLinkedList:

4.1. Творчество

LinkedList linkedList = new LinkedList<>();



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

LinkedList реализует интерфейсList иDeque, помимо стандартных методовadd() иaddAll() вы можете найтиaddFirst() иaddLast(), которые добавляют элемент в начале или в конце соответственно.

4.3. Удаление элемента

Подобно добавлению элементов, эта реализация списка предлагаетremoveFirst() иremoveLast().

Также есть удобный методremoveFirstOccurence() иremoveLastOccurence(), который возвращает логическое значение (true, если коллекция содержит указанный элемент).

4.4. Очередь операций

ИнтерфейсDeque обеспечивает поведение, подобное очереди (на самом делеDeque расширяет интерфейсQueue):

linkedList.poll();
linkedList.pop();

Эти методы извлекают первый элемент и удаляют его из списка.

Разница междуpoll() иpop() заключается в том, чтоpop выбрасываетNoSuchElementException() в пустой список, тогда какpoll возвращает ноль. Также доступны APIpollFirst() иpollLast().

Вот, например, как работает APIpush:

linkedList.push(Object o);

Который вставляет элемент в качестве главы коллекции.

LinkedList имеет много других методов, большинство из которых должно быть знакомо пользователю, который уже использовалLists. Другие, предоставляемыеDeque, могут быть удобной альтернативой «стандартным» методам.

Полную документацию можно найтиhere.

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

ArrayList обычно является реализациейList по умолчанию.

Однако есть определенные варианты использования, в которых использованиеLinkedList будет более подходящим, например, предпочтения для постоянного времени вставки / удаления (например, частые вставки / удаления / обновления), с постоянным временем доступа и эффективным использованием памяти.

Примеры кода можно найтиover on GitHub.