dir.by  
Поиск >>

Компьютер, программы
→
Java
→
Java (class, interface, collections, и т.д.)
 class LinkedList в Java 
посмотрели 1412 раз
обновлено: 6 октября 2026
class LinkedList<E> это набор узлов (Node). Каждый узел (Node) имеет 2 ссылки: ссылку на следующий узел (Node) и ссылку на предыдущий узел (Node).

LinkedList не синхронизирован. Если несколько потоков одновременно обращаются к LinkedList, и хотя бы один из потоков изменяет LinkedList, то LinkedList необходимо синхронизировать.

LinkedList
  реализует   interface List<E>      это массив т.е. можно добавлять и удалять элементы, получить элемент по индексу
  реализует   interface Queue<E>  это очередь т.е. добавление, удаление элементов по алгоритму: первым вошел - первым вышел
  реализует   interface Deque<E>  это двусторонняя очередь т.е. добавление, удаление элементов из начала и конца
  Java  
interface List<E> extends SequencedCollection<E>
{
Смотрим функции >> ...
}
  Java  
interface Queue<E> extends Collection<E>
{
Смотрим функции >> ...
}
  Java  
interface Deque<E> extends Collection<E>
{
Смотрим функции >> ...
}
Пример 1. Вызываем функции List
  Java     Создаем новое Java консольное приложение ... и напишем код
package org.example;
import java.util.LinkedList;

public class Program {
     public static void main(String[] args)
     {
          LinkedList<String> myList1 = new LinkedList<String>();

          // добавляем элемент в конец очереди
          myList1.add("Car");
          // myList1 = ["Car"]

          // добавляем элемент в конец очереди
          myList1.add("House");
          // myList1 = ["Car", "House"]

          // добавляем элемент в конец очереди
          myList1.add("Notebook");
          // myList1 = ["Car", "House", "Notebook"]

          // посмотреть элемент по индексу
          elem = myList1.get(1);
          // elem = "House"
          // myList1 = ["Car", "House", "Notebook"]

          // вставить элемент по индексу 1
          myList1.add(1, "Airplane");
          // myList1 = ["Car", "Airplane", "House", "Notebook"]

          // удалить элемент по индексу 1
          myList1.remove(1);
          // myList1 = ["Car", "House", "Notebook"]
     }
}
 
Пример 2. Вызываем функции Queue
  Java     Создаем новое Java консольное приложение ... и напишем код
package org.example;
import java.util.LinkedList;

public class Program {
     public static void main(String[] args)
     {
          LinkedList<String> myList1 = new LinkedList<String>();

          // добавляем элемент в конец очереди
          myList1.offer("Car");
          // myList1 = ["Car"]

          // добавляем элемент в конец очереди
          myList1.offer("House");
          // myList1 = ["Car", "House"]

          // добавляем элемент в конец очереди
          myList1.offer("Book");
          // myList1 = ["Car", "House", "Book"]

          // посмотреть элемент в начале очереди
          String elem = myList1.peek();
          // elem = "Car"
          // myList1 = ["Car", "House", "Book"]

          // берем элемент из начала очереди, элемент удаляется
          elem = myList1.poll();
          // elem = "Car"
          // myList1 = ["House", "Book"]
     }
}
 
Пример 3. Вызываем функции Deque
  Java     Создаем новое Java консольное приложение ... и напишем код
package org.example;
import java.util.LinkedList;

public class Program {
     public static void main(String[] args)
     {
          LinkedList<String> myList1 = new LinkedList<String>();

          /////// можно вызывать функции First & Last:
          // addFirst, addLast
          // offerFirst, offerLast
          // peekFirst, peekLasts
          // pollFirst, pollLast
          // removeFirst, removeLast

          myList1.addLast("Car");
          // myList1 = ["Car"]

          myList1.addLast("House");
          // myList1 = ["Car", "House"]

          myList1.addLast("Notebook");
          // myList1 = ["Car", "House", "Notebook"]

          myList1.addFirst("Airplane");
          // myList1 = ["Airplane", "Car", "House", "Notebook"]

          // посмотреть элемент в начале очереди
          elem = myList1.peekFirst();
          // elem = "Airplane"
          // myList1 = ["Airplane", "Car", "House", "Notebook"]

          // берем элемент из начала очереди, элемент удаляется
          elem = myList1.pollFirst();
          // elem = "Airplane"
          // myList1 = ["Car", "House", "Notebook"]

          // берем элемент из конца очереди, элемент удаляется
          elem = myList1.pollLast();
          // elem = "Notebook"
          // myList1 = ["Car", "House"]
     }
}
В чем примущество LinkedList перед ArrayList:
Преимущества LinkedList:

• Главное преимущество LinkedList перед ArrayList заключается в более эффективном добавлении и удалении элементов в начале или в середине списка, если у вас уже есть конкретный узел (Node) для этих операций.

• Быстрая вставка и удаление в начале коллекции: Добавление или удаление элемента в самом начале (addFirst(), removeFirst()) происходит за константное время O(1), в то время как ArrayList требует сдвига всех последующих элементов памяти O(N).

• Отсутствие перевыделения памяти (resizing): ArrayList внутри себя хранит обычный массив. Когда он заполнится, Java создает новый, более крупный массив и копирует туда старые данные — это дорогая операция. LinkedList состоит из отдельных узлов (Node), связанных ссылками, поэтому он может расти бесконечно без пересоздания структуры.

• Реализация интерфейса Deque (Очередь): LinkedList реализует интерфейс Deque (двустороннюю очередь), что позволяет использовать его как полноценную очередь с методами offer(), poll(), peek().
Когда LinkedList проигрывает ArrayList?

• Доступ по индексу: У ArrayList он происходит мгновенно O(1), а у LinkedList — медленно O(N), так как приходится идти по ссылкам с самого начала или конца.

• Потребление памяти: тратит больше памяти, так как каждый его элемент хранит не только само значение, но и две ссылки (на следующий и предыдущий элементы).
Документация
  Java  
class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
     transient int size = 0;
     transient Node<E> first;
     transient Node<E> last;

     private static class Node<E> {
          E item;
          Node<E> next;
          Node<E> prev;

          Node(Node<E> prev, E element, Node<E> next) {
               this.item = element;
               this.next = next;
               this.prev = prev;
          }
     }

     public LinkedList() {
     }

     public LinkedList(Collection<? extends E> c) {
          this();
          addAll(c);
     }

     public E getFirst() {
          final Node<E> f = first;
          if (f == null)
               throw new NoSuchElementException();
          return f.item;
     }

     public E getLast() {
          final Node<E> l = last;
          if (l == null)
               throw new NoSuchElementException();
          return l.item;
     }

     public E removeFirst() {
          final Node<E> f = first;
          if (f == null)
               throw new NoSuchElementException();
          return unlinkFirst(f);
     }

     public E removeLast() {
          final Node<E> l = last;
          if (l == null)
               throw new NoSuchElementException();
          return unlinkLast(l);
     }

     public void addFirst(E e) {
          linkFirst(e);
     }

     public void addLast(E e) {
          linkLast(e);
     }

     public boolean contains(Object o) {
          return indexOf(o) >= 0;
     }

     public int size() {
          return size;
     }

     public boolean add(E e) {
          linkLast(e);
          return true;
     }

     public boolean remove(Object o) {
          if (o == null) {
               for (Node<E> x = first; x != null; x = x.next) {
                    if (x.item == null) {
                         unlink(x);
                         return true;
                    }
               }
          } else {
               for (Node<E> x = first; x != null; x = x.next) {
                    if (o.equals(x.item)) {
                         unlink(x);
                         return true;
                    }
               }
          }
          return false;
     }

     public boolean addAll(Collection<? extends E> c) {
          return addAll(size, c);
     }

     public boolean addAll(int index, Collection<? extends E> c) {
          checkPositionIndex(index);

          Object[] a = c.toArray();
          int numNew = a.length;
          if (numNew == 0)
               return false;

          Node<E> pred, succ;
          if (index == size) {
               succ = null;
               pred = last;
          } else {
               succ = node(index);
               pred = succ.prev;
          }

          for (Object o : a) {
               @SuppressWarnings("unchecked") E e = (E) o;
               Node<E> newNode = new Node<>(pred, e, null);
               if (pred == null)
                    first = newNode;
               else
                    pred.next = newNode;
               pred = newNode;
          }

          if (succ == null) {
               last = pred;
          } else {
               pred.next = succ;
               succ.prev = pred;
          }

          size += numNew;
          modCount++;
          return true;
     }

     public void clear() {
          // Clearing all of the links between nodes is "unnecessary", but:
          // - helps a generational GC if the discarded nodes inhabit
          // more than one generation
          // - is sure to free memory even if there is a reachable Iterator
          for (Node<E> x = first; x != null; ) {
               Node<E> next = x.next;
               x.item = null;
               x.next = null;
               x.prev = null;
               x = next;
          }
          first = last = null;
          size = 0;
          modCount++;
     }

     public E get(int index) {
          checkElementIndex(index);
          return node(index).item;
     }

     public E set(int index, E element) {
          checkElementIndex(index);
          Node<E> x = node(index);
          E oldVal = x.item;
          x.item = element;
          return oldVal;
     }

     public void add(int index, E element) {
          checkPositionIndex(index);

          if (index == size)
               linkLast(element);
          else
               linkBefore(element, node(index));
     }

     public E remove(int index) {
          checkElementIndex(index);
          return unlink(node(index));
     }

     // Search Operations
     public int indexOf(Object o) {
          int index = 0;
          if (o == null) {
               for (Node<E> x = first; x != null; x = x.next) {
                    if (x.item == null)
                         return index;
                    index++;
               }
          } else {
               for (Node<E> x = first; x != null; x = x.next) {
                    if (o.equals(x.item))
                         return index;
                    index++;
               }
          }
          return -1;
     }

     public int lastIndexOf(Object o) {
          int index = size;
          if (o == null) {
               for (Node<E> x = last; x != null; x = x.prev) {
                    index--;
                    if (x.item == null)
                         return index;
               }
          } else {
               for (Node<E> x = last; x != null; x = x.prev) {
                    index--;
                    if (o.equals(x.item))
                         return index;
               }
          }
          return -1;
     }

     // Queue operations.
     public E peek() {
          final Node<E> f = first;
          return (f == null) ? null : f.item;
     }

     public E element() {
          return getFirst();
     }

     public E poll() {
          final Node<E> f = first;
          return (f == null) ? null : unlinkFirst(f);
     }

     public E remove() {
          return removeFirst();
     }

     public boolean offer(E e) {
          return add(e);
     }

     public boolean offerFirst(E e) {
          addFirst(e);
          return true;
     }

     public boolean offerLast(E e) {
          addLast(e);
          return true;
     }

     public E peekFirst() {
          final Node<E> f = first;
          return (f == null) ? null : f.item;
     }

     public E peekLast() {
          final Node<E> l = last;
          return (l == null) ? null : l.item;
     }

     public E pollFirst() {
          final Node<E> f = first;
          return (f == null) ? null : unlinkFirst(f);
     }

     public E pollLast() {
          final Node<E> l = last;
          return (l == null) ? null : unlinkLast(l);
     }

     public void push(E e) {
          addFirst(e);
     }

     public E pop() {
          return removeFirst();
     }

     public boolean removeFirstOccurrence(Object o) {
          return remove(o);
     }

     public boolean removeLastOccurrence(Object o) {
          if (o == null) {
               for (Node<E> x = last; x != null; x = x.prev) {
                    if (x.item == null) {
                         unlink(x);
                         return true;
                    }
               }
          } else {
               for (Node<E> x = last; x != null; x = x.prev) {
                    if (o.equals(x.item)) {
                         unlink(x);
                         return true;
                    }
               }
          }
          return false;
     }

     public ListIterator<E> listIterator(int index) {
          checkPositionIndex(index);
          return new ListItr(index);
     }

     public Object clone() {
          LinkedList<E> clone = superClone();

          // Put clone into "virgin" state
          clone.first = clone.last = null;
          clone.size = 0;
          clone.modCount = 0;

          // Initialize clone with our elements
          for (Node<E> x = first; x != null; x = x.next)
               clone.add(x.item);

          return clone;
     }

     public Object[] toArray() {
          Object[] result = new Object[size];
          int i = 0;
          for (Node<E> x = first; x != null; x = x.next)
               result[i++] = x.item;
          return result;
     }

     public <T> T[] toArray(T[] a) {
          if (a.length < size)
               a = (T[])java.lang.reflect.Array.newInstance(
                         a.getClass().getComponentType(), size);
          int i = 0;
          Object[] result = a;
          for (Node<E> x = first; x != null; x = x.next)
               result[i++] = x.item;

          if (a.length > size)
               a[size] = null;

          return a;
     }

     public Spliterator<E> spliterator() {
          return new LLSpliterator<>(this, -1, 0);
     }

     public LinkedList<E> reversed() {
          return new ReverseOrderLinkedListView<>(this, super.reversed(), Deque.super.reversed());
     }
}
Подробнее о методах в Java документации:https://docs.oracle.com ...
 
← Предыдущая тема
interface Deque<E> в Java
 
Следующая тема →
interface Set в Java
 
Ваши Отзывы ... комментарии ...
   
Вашe имя
Ваш комментарий (www ссылки может добавлять только залогиненный пользователь)

 
Скачать и установить
• Установка JDK (скачиваем и устанавливаем библиотеку Java для Windows)
• Скачать и установить IntelliJ IDEA для изучения Java, Spring, Jakarta EE | Функциональность и отличия: Community | Ultimate
• Error "JDK is missing" | Java
Java (class, interface, collections, и т.д.)
• Создание простого консольного приложения в IntelliJ IDEA для изучения Java
• Модификаторы доступа (private, protected, public) для класса и для методов, полей. | Java
• Коллекции в Java
• interface List<E> в Java
• class ArrayList<E> в Java
• class Vector<E> в Java
• class Stack<E> в Java
• class CopyOnWriteArrayList<E> в Java
• interface Queue<E> в Java
• interface Deque<E> в Java
• class LinkedList<E> в Java
• interface Set в Java
• class HashSet<E> в Java
• class LinkedHashSet<E> в Java
• Collections.singletonList("Hello") возвращает неизменяемый список, содержащий ровно один указанный элемент | Java collection
• class Collections (все функции, алгоритмы) | Java
• stream.filter(...) выбираем элементы по своему критерию | Java collection | Пример: allCars.stream().filter(item -> item.Price < 30000).toList()
• Что такое interface в Java ?
• Прямо в коде (во время выполнения) делаем имплементацию для interface | Java
• Потоки в Java
• lambda это безымянный метод (нет имени и не принадлежит классу) | Java
• Исключения и обработка в Java. Пример: try {...} catch (Exception e) {...}
• Зачем использовать throws Exception в названии функциии в Java ? Ответ: метод создает исключение и нет обработки try catch. Пример: float CalculateDensity(float mass, float volume) throws Exception { ... throw new Exception("Error! Volume is zero."); ... }
Java web приложение (сервлет, jsp страница, основная функциональность и без фрэймворков)
• Создаем новое простое web приложение (jsp web страница) | Java, Maven
• Создаем web сервлет (сервлет находится на веб-сервере, по запросу возвращает результат) | Java
• Установка Tomcat web server (скачиваем и устанавливаем для Windows)
• Проверяем, тестируем Tomcat web server (создаем новый my.hml файл)
• Что такое Maven
• Что такое динамическая web страница jsp (Java Server Page) ?
• Как инсталировать Smart Tomcat plugin в Intellij Idea
• Ошибка "The SDK is not specified for module ... | Project SDK is not defined ..." в IntelliJ IDEA | Java
Spring в Java (Spring Framework, Spring Data, Spring Boot, ...)
• Что такое Spring? Зачем в Java использовать Spring?
• Что такое Spring Bean? Что такое Spring Container? IoC (inversion of control) | Создание простого Spring проекта и конфигурациия Spring Container в XML файле | Редактор IntelliJ Idea и язык Java
• Что такое Dependency Injection в Spring? Создание простого Spring проекта с Dependency Injection в конструкторе с атрибутами @Component, @Autowired | Редактор IntelliJ Idea и язык Java
• Создаем новое Spring Web приложение (запрос идет в Controller → Controller создает ответ как текст или json) | Java, Spring Web, Spring Boot, Maven
• Создаем новое Spring WebSocket приложение (Java WebSocket шлет сообщение к JavaScript WebSocket) | Java, Spring WebSocket, Spring Boot, Maven
• Создаем Azure Web App с типом Java (бесплатно). То есть создаем пустой web server
• Java Spring web приложение кладем в Azure
• К приложению Azure Web App (Java) соединяемся через FTP | используем File Explorer
• Ошибка "The SDK is not specified for module ... | Project SDK is not defined ..." в IntelliJ IDEA | Java, Spring Boot
• Как инсталировать Spring WebSocket plugin в Intellij Idea
Jakarta EE / Java EE в Java (web приложения, web сервисы)
• Что такое Jakarta EE (Java EE) ? | В каком редакторе (программе) удобно писать Jakarta EE (Java EE) код?
• Создание простого web-проекта в IntelliJ Idea Ultimate | Jakarta EE (Java EE)
Struts на Java (расширяет API Java Servlet используя MVC)
• Что такое Struts | Java
Курсы, обучение
• Курс "Java-разработчик" от Yandex
Собеседование
• Собеседования на Java

  Ваши вопросы присылайте по почте: info@dir.by