𝗠𝗮𝘀𝘁𝗲𝗿 𝗝𝗮𝘃𝗮 𝗖𝗼𝗹𝗹𝗲𝗰𝘁𝗶𝗼𝗻𝘀
Die meisten Entwickler greifen standardmäßig zu ArrayList oder HashSet. Das funktioniert für einfache Aufgaben. Es stößt jedoch an seine Grenzen, wenn es auf Geschwindigkeit oder Skalierbarkeit ankommt.
Ich habe einmal eine Bestenliste für ein Spiel mit einer einfachen ArrayList erstellt. Ich habe sie jedes Mal neu sortiert, wenn sich ein Score änderte. Die Benutzeroberfläche fror ständig ein. Ich habe gegen die Sprache gekämpft, anstatt sie zu nutzen.
Hören Sie auf, die falschen Werkzeuge zu verwenden. Nutzen Sie diese drei spezialisierten Collections, um schnelleren und saubereren Code zu schreiben.
- EnumSet für Enum-Konstanten
Wenn Sie HashSet für Enums verwenden, zahlen Sie einen Performance-Preis. Jedes Einfügen führt dazu, dass das Enum in ein Objekt „boxed“ wird. Dies verursacht unnötigen Overhead.
EnumSet verwendet einen Bit-Vektor. Es führt Prüfungen mit einem einzigen CPU-Befehl aus.
- Verwenden Sie es, wenn Sie einen festen Satz von Enum-Werten haben.
- Es reduziert die Garbage Collection.
- Es bietet eine bis zu 10-fache Geschwindigkeitssteigerung in engen Schleifen.
Before:
Set
After:
EnumSet
- NavigableSet für Bereichsabfragen
Das manuelle Durchlaufen einer sortierten Liste, um einen Bereich zu finden, ist langsam und fehleranfällig. Oft landet man bei „Off-by-one“-Fehlern.
NavigableSet hält Ihre Daten automatisch sortiert. Es bietet O(log n)-Lookups für Teilmengen.
- Verwenden Sie es für Bestenlisten oder Preisspannen.
- Nutzen Sie headSet() oder subSet(), um bestimmte Bereiche abzugreifen.
- Es macht manuellen Sortiercode überflüssig.
Before:
Collections.sort(scores);
List
After:
NavigableSet
- CopyOnWriteArrayList für leseintensive Listen
Die Verwendung von synchronized-Blöcken auf einer ArrayList verlangsamt jeden Lesezugriff. Zudem führt es zu einer ConcurrentModificationException, wenn ein Thread schreibt, während ein anderer liest.
CopyOnWriteArrayList erstellt bei jedem Schreibvorgang eine neue Kopie des Arrays. Leser arbeiten mit einem Snapshot des Arrays.
- Verwenden Sie es für Event-Listener oder Konfigurationseinstellungen.
- Verwenden Sie es, wenn Lesezugriffe viel häufiger vorkommen als Schreibzugriffe.
- Es ermöglicht sperrfreie (lock-free) Lesezugriffe.
Before:
List
After:
CopyOnWriteArrayList
Hör auf, immer nur dieselben zwei Collections zu verwenden. Wähle das Werkzeug, das zu deinem Datenmuster passt.
Quelle: https://dev.to/timevolt/the-java-collections-force-mastering-the-hidden-gems-like-a-jedi-4438