Когда нужно использовать LinkedList

Ответ

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

Пример:

val linkedList = LinkedList<String>()
linkedList.add("A") // O(1)
linkedList.add(1, "B") // O(n) - поиск позиции
linkedList.removeFirst() // O(1)

Но для доступа по индексу (get/set) LinkedList плох - O(n) против O(1) у ArrayList. Также LinkedList потребляет больше памяти из-за хранения ссылок. В большинстве случаев ArrayList предпочтительнее.

Ответ 18+ 🔞

А, ну вот смотри, тут про коллекции в Kotlin/Java. Ебать мои старые костыли, сколько раз уже этот спор видел. Слушай, если ты такой умный и думаешь, что LinkedList — это серебряная пуля, то ты, чувак, идёшь по охуенно тонкому льду.

Вот представь: LinkedList — это как цепочка из пьяных друзей на вечеринке. Каждый держит за руку следующего. Хочешь впихнуть нового чувака в середину? Ёпта, просто говоришь соседям: «Эй, Вася, отпусти Петю, возьми за руку этого нового Костю, а ты, Костя, теперь держи Петю». И всё, операция O(1), если ты уже стоишь рядом с этим местом. Вставка, удаление — красота. Особенно если пилить с начала или конца списка — removeFirst() или addLast() — вообще зашибись.

val linkedList = LinkedList<String>()
linkedList.add("A") // O(1) — кинул в конец, и похуй
linkedList.add(1, "B") // O(n) — а вот тут уже подвох, бля! Чтобы вставить на позицию 1, надо сначала дойти до этого узла, перебирая всех этих пьяных друзей по цепочке.
linkedList.removeFirst() // O(1) — отцепил первого и пошёл дальше

Но, сука, вот в чём пиздец! А если тебе нужно просто узнать, а что там у пятого друга в кармане? С ArrayList — это моментально, O(1), ты сразу по адресу прыгаешь. А с LinkedList — это O(n), тебе придётся идти от первого мудака ко второму, от второго к третьему, и так далее, и всем «привет-пока» говорить. Удивление пиздец, когда в цикле начинаешь по индексам лазать — производительность накрывается медным тазом.

И память! Каждый узел в LinkedList — это же не только данные, а ещё две ссылки (на предыдущего и следующего «друга»). Для простых строк или циферок это овердохуища накладных расходов. ArrayList же — тупая, честная последовательная полка в памяти. Компактно, быстро для доступа.

Так что правило простое, бля: в 95% случаев бери ArrayList и не парься. LinkedList — это специфичный инструмент, когда у тебя реально адские вставки/удаления в середине и ты готов за это расплачиваться медленным доступом и жором памяти. А иначе — ты просто мартышлюшка, которая использует грабли вместо молотка, потому что «оно же в названии List есть».