programowanieProgramista Backend

Jak działają kolekcje w Javie? Czym różnią się ArrayList, LinkedList i HashMap?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

W Javie kolekcje implementują struktury danych do pracy z grupami obiektów. Główne struktury:

  • ArrayList (implementuje interfejs List) przechowuje elementy w tablicy, zapewnia szybki dostęp po indeksie, ale wstawianie/usuwanie elementów w środku jest wolne, ponieważ wymaga przesunięcia elementów.

  • LinkedList (również implementuje List) zbudowany jest na liście dwukierunkowej. Szybko wstawia/usuwa elementy w środku, ale dostęp po indeksie jest wolny, ponieważ trzeba przejść listę od początku lub końca.

  • HashMap implementuje interfejs Map. Przechowuje pary klucz-wartość. Szybki dostęp (O(1)) do wartości po kluczu zapewniany jest przez funkcję haszującą, ale nie gwarantuje porządku elementów.

List<String> arrayList = new ArrayList<>(); arrayList.add("A"); // szybko arrayList.get(0); // szybko List<String> linkedList = new LinkedList<>(); linkedList.add("A"); // trochę wolniej linkedList.add(0, "B"); // szybko Map<String, Integer> map = new HashMap<>(); map.put("one", 1); Integer val = map.get("one"); // szybko

Pytanie z haczykiem.

Jaka jest zasadnicza różnica między HashMap a Hashtable, i dlaczego Hashtable jest praktycznie nieużywana w nowoczesnym kodzie?

Odpowiedź: HashMap nie jest zsynchronizowany, dopuszcza null zarówno jako klucz, jak i wartość. Hashtable jest zsynchronizowany (kilka wątków może pracować na jednym obiekcie bez zagrożenia integralności), ale nie dopuszcza null i jest wolniejszy. W nowoczesnym kodzie częściej używa się ConcurrentHashMap dla bezpieczeństwa wątków, ponieważ jest bardziej efektywny i łatwiej dostosowuje się do obliczeń wielowątkowych.

Map<String, String> map1 = new HashMap<>(); map1.put(null, "value"); // OK Map<String, String> map2 = new Hashtable<>(); map2.put(null, "value"); // NullPointerException

Przykłady rzeczywistych błędów spowodowanych brakiem znajomości niuansów tematu.


Historia

W systemie ewidencji uczniów używano ArrayList do częstych wstawek i usunięć w środku listy, co doprowadziło do znacznego pogorszenia wydajności przy dużych zbiorach danych. Po zamianie na LinkedList sytuacja się poprawiła.


Historia

W jednej wielowątkowej systemie CRM używano HashMap do przechowywania danych między wątkami bez synchronizacji, co okresowo prowadziło do niespójnych danych i awarii z powodu race condition. Po przejściu na ConcurrentHashMap błąd zniknął.


Historia

Programista próbował dodać klucz null do Hashtable, nie znając zakazu. To spowodowało NullPointerException, długo nie mogli znaleźć, dlaczego aplikacja nagle się wyłącza.