poniedziałek, maja 29, 2023

LinkedList w Java'ie to taki miś koala...

Jest totalnie bezużyteczna...

Niby ma swoje zalety jak się dodaje coś z przodu lub z tyłu, ale ArrayDeque potrafi to samo, a jest lepsza pod każdym innym względem.

I nie chodzi o to, że LinkedList jako struktura danych jest zła, bo jest super i ma masę zalet, ale tak się składa, że jej implementacja w Java'ie nie ma dziś praktycznie sensu i zastosowania.

No bo tak, jak chodzi o dostępy to jedyne co ma w O(1) to dodaj z przodu i dodaj z tyłu, nie ma dostępu swobodnego do elementów czyli dotarcie do elementu zajmuje O(N), nawet coś co teoretycznie powinno zająć O(1) czyli połączenie 2 LinkedList w Java'owej implementacji zajmuje O(N) (bo po drodze jest budowana tablica z dodawaną listą...).

Jak samemu się implementuje LinkedList to można robić cuda, ożeń to z HashMap i możesz zbudować fajny cache LRU (OK, ale prościej użyć LinkedHashMap ;-)).

Ktoś może powiedzieć, że LinkedList jest fajna z punktu widzenia pamięci.... ale też nie, jej narzut staje się większy od ArrayList już chyba po 4 elementach... narzut na 1 element w Java 17 64 bity w ArrayList to jest 8 bajtów (czyli tyle ile kosztuje referencja w tablicy), w LinkedList to 40 bajtów (1 referencja do elementu, 1 do prev, jedna do next i szczerze nawet nie wiem co to jest pozostałe 16 bajtów).

OK, przewagą nad ArrayList jest to, że dodanie elementu na końcu ZAWSZE* jest O(1), a w ArrayList raz ma jakiś czas zajmuje O(N), ale już zamortyzowany czas dla ArrayList to też O(1) (i chyba z mniejsza stałą).
No dobrze w porównaniu z ArrayList umie też dodawać w O(1) z przodu, ale z zastrzeżeniem, że chodzi o czas zamortyzowany to ArrayDeque też to umie....

Chociaż niby ten narzut pamięciowy jest tak sobie ważny, jak to jest List<Integer> to zajmuje rzeczywiście dużo więcej miejsca, ale jak to są jakieś bardziej złożone obiekty, z których każdy zajmuje dużo miejsca to te 50 bajtów na node można darować... chociaż łatwiej jednak darować te 8 bajtów z ArrayList.

Tak trochę mam wrażenie, że LinkedList z nami została bo trzeba ją było zaimplementować, przydawała się kiedyś jako stos i może kolejka i tyle....

Stąd jak widzę użycie gdzieś LinkedList w Java'ie to dla mnie to jest już code smell ;-)

A co do misia koali... to tutaj polecam ;-)


* - ZAWSZE z pewnymi wyjątkami, jak będzie GC to i tak zajmie więcej ;-)



Podobne postybeta
Po Devoxx&#39;ie
Jak z metody size() w List w Java'ie dostać ujemną liczbę? ;-)
Java 32 bit vs. Java 64 bit
Go dla Java'owca ;-) odcinek 2 "kontenery dwa ;-)"
Referencje w Java'ie

Brak komentarzy:

Prześlij komentarz