𝗢𝗽𝗮𝗻𝘂𝗷 𝗝𝗮𝘃𝗮 𝗖𝗼𝗹𝗹𝗲𝗰𝘁𝗶𝗼𝗻𝘀
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.
- 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.
- Używaj go, gdy masz stały zestaw wartości enum.
- Zmniejsza obciążenie mechanizmu Garbage Collection.
- Zapewnia 10-krotny wzrost prędkości w ciasnych pętlach.
Przed:
Set
Po:
EnumSet
- 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).
- Używaj go do tabel wyników lub zakresów cenowych.
- Użyj headSet() lub subSet(), aby pobrać konkretne zakresy.
- Eliminuje potrzebę pisania kodu do ręcznego sortowania.
Przed:
Collections.sort(scores);
List
Po:
NavigableSet
- 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.
- Używaj go dla listenerów zdarzeń lub ustawień konfiguracji.
- Używaj go, gdy odczyty występują znacznie częściej niż zapisy.
- Pozwala na odczyty bez blokowania (lock-free).
Przed:
List
Po:
CopyOnWriteArrayList
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