Метод add() класса Java LinkedList
Класс LinkedList предоставляет несколько перегруженных версий метода add() для добавления элементов в список.
1、boolean add(E e)
Это самый базовый метод add, который добавляет указанный элемент в конец списка.
Пример
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
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
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);
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
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);
// Вывод: [Проверить почту, Позвонить маме, Купить продукты]
// Добавить задачу
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());
}
// Операция постановки в очередь
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]
LinkedList<String> list2 = new LinkedList<>(Arrays.asList("D", "E", "F"));
list1.addAll(list2);
System.out.println(list1); // Вывод: [A, B, C, D, E, F]
Примечания
- Потокобезопасность: LinkedList не является потокобезопасным и требует внешней синхронизации в многопоточной среде
- Элементы null: Добавление элементов null разрешено
- Проверка индекса: обратите внимание на граничные условия при использовании метода add с индексом
- Одновременная модификация: изменение списка во время использования итератора приведёт к исключению ConcurrentModificationException
Java LinkedList