23. Чем отличаются ArrayList и LinkedList?

23. Чем отличаются ArrayList и LinkedList?

UNKNOWN

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

ArrayList:

  • доступ к произвольному элементу по индексу за константное время O(1);
  • доступ к элементам по значению за линейное время O(N);
  • вставка в конец в среднем производится за константное время O(1);
  • удаление произвольного элемента из списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (capacity) не изменяется);
  • вставка элемента в произвольное место списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку вправо;
  • минимум накладных расходов при хранении.

LinkedList:

  • на получение элемента по индексу или значению потребуется линейное время O(N);
  • на добавление и удаление в начало или конец списка потребуется константное O(1);
  • вставка или удаление в/из произвольного место константное O(1);
  • требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся еще указатели на следующий и предыдущий элементы списка.

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

Для ArrayList или для LinkedList операция добавления элемента в середину (list.add(list.size()/2, newElement)) медленнее?

Для ArrayList:

  • проверка массива на вместимость. Если вместимости недостаточно, то увеличение размера массива и копирование всех элементов в новый массив (O(N));
  • копирование всех элементов, расположенных правее от позиции вставки, на одну позицию вправо (O(N));
  • вставка элемента (O(1)).

Для LinkedList:

  • поиск позиции вставки (O(N));
  • вставка элемента (O(1)).

В худшем случае вставка в середину списка эффективнее для LinkedList. В остальных - скорее всего, для ArrayList, поскольку копирование элементов осуществляется за счет вызова быстрого системного метода System.arraycopy().


Предыдущий вопрос: 22. Почему LinkedList реализует и List, и Deque?

Следующий вопрос: 24. Что такое Queue?

Все вопросы по теме: список

Все темы: список

Вопросы/замечания/предложения/нашли ошибку:напишите мне

Report Page