Метод add() класса Java LinkedList

Java LinkedList Java LinkedList


Класс LinkedList предоставляет несколько перегруженных версий метода add() для добавления элементов в список.

1、boolean add(E e)

Это самый базовый метод add, который добавляет указанный элемент в конец списка.

Пример

LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");

Характеристики метода:

  • Всегда возвращает true (потому что LinkedList допускает дублирующиеся элементы)
  • Временная сложность — O(1)
  • Эквивалентен методу addLast()

2、void add(int index, E element)

Вставляет указанный элемент в указанную позицию в списке.

Пример

LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add(1, "Orange"); // Вставить по индексу 1

Характеристики метода:

  • Если индекс равен размеру списка, это эквивалентно add(E e)
  • Требуется обход до указанной позиции, средняя временная сложность — O(n)
  • Может выбросить IndexOutOfBoundsException

3、boolean addAll(Collection<? extends E> c)

Добавляет все элементы указанной коллекции в конец списка в порядке, возвращаемом её итератором.

Пример

LinkedList<String> fruits = new LinkedList<>();
fruits.add("Apple");
fruits.add("Banana");

List<String> moreFruits = Arrays.asList("Orange", "Grape");
fruits.addAll(moreFruits);

Характеристики метода:

  • Возвращает true, если список изменился в результате вызова
  • Временная сложность — O(m), где m — размер коллекции параметров

4、boolean addAll(int index, Collection<? extends E> c)

Вставляет все элементы из указанной коллекции в этот список, начиная с указанной позиции.

Пример

LinkedList<String> fruits = new LinkedList<>();
fruits.add("Apple");
fruits.add("Banana");

List<String> moreFruits = Arrays.asList("Orange", "Grape");
fruits.addAll(1, moreFruits); // Вставить коллекцию по индексу 1

Характеристики метода:

  • Сначала требуется пройти до указанной позиции
  • Временная сложность — O(n + m), где n — размер списка, а m — размер коллекции

Сравнение с другими методами

add() против addLast()

  • add(E e)иaddLast(E e)Полностью эквивалентны
  • Оба используются для добавления элементов в конец списка

add() против offer()

  • add(E e)Может выбросить исключение в очереди с ограниченной ёмкостью
  • offer(E e)Возвращает false вместо выброса исключения в очереди с ограниченной ёмкостью

add() против push()

  • push(E e)Фактически вызываетaddFirst(E e)
  • Добавляет элемент в начало списка вместо конца

Соображения производительности

Эффективность операций добавления

  • Добавление в конец: временная сложность O(1)
  • Добавление в начало: временная сложность O(1) (с использованием addFirst())
  • Добавление в середину: временная сложность O(n) (требуется обход до указанной позиции)

Сравнение с ArrayList

Действие LinkedList ArrayList
Добавление в конец O(1) O(1) амортизированное
Добавление в начало O(1) O(n)
Добавление в середину O(n) O(n)
Произвольный доступ O(n) O(1)

Примеры практического применения

Создание списка дел

Пример

LinkedList<String> todoList = new LinkedList<>();

// Добавить задачу
todoList.add("Купить продукты");
todoList.addFirst("Проверить почту"); // Задача с высоким приоритетом
todoList.add(1, "Позвонить маме"); // Средний приоритет

System.out.println(todoList);
// Вывод: [Проверить почту, Позвонить маме, Купить продукты]

Реализация простой очереди

Пример

LinkedList<String> queue = new LinkedList<>();

// Операция постановки в очередь
queue.add("Первый");
queue.add("Second");
queue.add("Third");

// Операция извлечения из очереди
while(!queue.isEmpty()) {
    System.out.println(queue.removeFirst());
}

Объединение двух списков

Пример

LinkedList<String> list1 = new LinkedList<>(Arrays.asList("A", "B", "C"));
LinkedList<String> list2 = new LinkedList<>(Arrays.asList("D", "E", "F"));

list1.addAll(list2);
System.out.println(list1); // Вывод: [A, B, C, D, E, F]

Примечания

  1. Потокобезопасность: LinkedList не является потокобезопасным и требует внешней синхронизации в многопоточной среде
  2. Элементы null: Добавление элементов null разрешено
  3. Проверка индекса: обратите внимание на граничные условия при использовании метода add с индексом
  4. Одновременная модификация: изменение списка во время использования итератора приведёт к исключению ConcurrentModificationException

Java LinkedList Java LinkedList

Другие расширения