← Назад ко всем вопросам

В чем разница между ArrayList и LinkedList

1️⃣ Как кратко ответить

ArrayList и LinkedList — это реализации интерфейса List в Java. ArrayList основан на динамическом массиве, что обеспечивает быстрый доступ по индексу, но медленные операции вставки и удаления. LinkedList основан на двусвязном списке, что делает его более эффективным для частых операций вставки и удаления, но медленным для доступа по индексу.

2️⃣ Подробное объяснение темы

ArrayList и LinkedList — это две популярные реализации интерфейса List в Java, каждая из которых имеет свои особенности и области применения.

ArrayList

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

  • Доступ по индексу: ArrayList обеспечивает быстрый доступ к элементам по индексу, так как это просто обращение к элементу массива. Операция имеет временную сложность O(1).
  • Вставка и удаление: Вставка и удаление элементов, особенно в середине списка, могут быть медленными, так как требуют сдвига элементов. Эти операции имеют временную сложность O(n).
  • Использование памяти: ArrayList может использовать больше памяти, чем необходимо, из-за резервирования дополнительного пространства для роста.

Пример использования ArrayList:

import java.util.ArrayList;
​
public class Example {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("A"); // Добавление элемента в конец списка
        list.add("B");
        list.add("C");
​
        String element = list.get(1); // Получение элемента по индексу 1
        System.out.println(element); // Вывод: B
​
        list.remove(1); // Удаление элемента по индексу 1
        System.out.println(list); // Вывод: [A, C]
    }
}

LinkedList

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

  • Доступ по индексу: Доступ к элементам по индексу в LinkedList медленный, так как требует последовательного прохода от начала или конца списка до нужного элемента. Операция имеет временную сложность O(n).
  • Вставка и удаление: Вставка и удаление элементов в любом месте списка выполняются быстро, так как требуют изменения только нескольких ссылок. Эти операции имеют временную сложность O(1).
  • Использование памяти: LinkedList использует больше памяти на каждый элемент, так как хранит дополнительные ссылки на соседние элементы.

Пример использования LinkedList:

import java.util.LinkedList;
​
public class Example {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("A"); // Добавление элемента в конец списка
        list.add("B");
        list.add("C");
​
        String element = list.get(1); // Получение элемента по индексу 1
        System.out.println(element); // Вывод: B
​
        list.remove(1); // Удаление элемента по индексу 1
        System.out.println(list); // Вывод: [A, C]
    }
}

Выбор между ArrayList и LinkedList

  • Используйте ArrayList, если вам нужен быстрый доступ по индексу и операции вставки/удаления не являются частыми.
  • Используйте LinkedList, если вам нужно часто вставлять и удалять элементы в середине списка, и доступ по индексу не является критичным.

Тема: Java
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки