𝗢𝗽𝗮𝗻𝘂𝗷 𝗝𝗮𝘃𝗮 𝗖𝗼𝗹𝗹𝗲𝗰𝘁𝗶𝗼𝗻𝘀

Większość programistów domyślnie wybiera ArrayList lub HashSet. To sprawdza się przy prostych zadaniach, ale zawodzi, gdy potrzebna jest szybkość lub skalowalność.

Kiedyś zbudowałem tabelę wyników w grze, używając zwykłego ArrayList. Sortowałem ją za każdym razem, gdy zmieniał się wynik. Interfejs użytkownika stale się zawieszał. Walczyłem z językiem, zamiast go używać.

Przestań używać niewłaściwych narzędzi. Skorzystaj z tych trzech wyspecjalizowanych kolekcji, aby pisać szybszy i czystszy kod.

  1. EnumSet dla stałych Enum

Jeśli używasz HashSet dla wyliczeń (enums), płacisz „podatek” wydajnościowy. Każde wstawienie powoduje opakowanie (boxing) wartości enum w obiekt. Dodaje to niepotrzebny narzut.

EnumSet wykorzystuje wektor bitowy. Wykonuje sprawdzenia za pomocą pojedynczej instrukcji procesora.

Przed: Set abilities = new HashSet<>(); abilities.add(Ability.FIRE);

Po: EnumSet abilities = EnumSet.of(Ability.FIRE);

  1. NavigableSet do zapytań o zakresy

Ręczne przechodzenie przez posortowaną listę w celu znalezienia zakresu jest wolne i podatne na błędy. Często kończy się to błędami typu „off-by-one”.

NavigableSet automatycznie utrzymuje dane w posortowanej kolejności. Zapewnia wyszukiwanie podzbiorów w czasie O(log n).

Przed: Collections.sort(scores); List topTen = scores.subList(size - 10, size);

Po: NavigableSet scores = new TreeSet<>(Comparator.reverseOrder()); scores.add(1542); NavigableSet topTen = scores.headSet(scores.first(), true).stream().limit(10).collect(Collectors.toCollection(TreeSet::new));

  1. CopyOnWriteArrayList dla list z dużą liczbą odczytów

Używanie bloków synchronized na ArrayList spowalnia każdy odczyt. Powoduje również ConcurrentModificationException, jeśli jeden wątek zapisuje, podczas gdy inny odczytuje.

CopyOnWriteArrayList tworzy nową kopię tablicy przy każdym zapisie. Czytelnicy operują na migawce (snapshot) tablicy.

Przed: List log = Collections.synchronizedList(new ArrayList<>()); // Iteracja tutaj może spowodować błąd, jeśli pojawi się wątek zapisujący.

Po: CopyOnWriteArrayList log = new CopyOnWriteArrayList<>(); // Iteracja jest bezpieczna i nigdy nie powoduje błędów.

Przestań polegać wyłącznie na tych samych dwóch kolekcjach. Wybierz narzędzie, które najlepiej odpowiada wzorcowi Twoich danych.

Źródło: https://dev.to/timevolt/the-java-collections-force-mastering-the-hidden-gems-like-a-jedi-4438