𝗠𝗮𝘀𝘁𝗲𝗿 𝗝𝗮𝘃𝗮 𝗖𝗼𝗹𝗹𝗲𝗰𝘁𝗶𝗼𝗻𝘀

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.

  1. 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.

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

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

  1. 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.

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

After: 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 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.

Before: List log = Collections.synchronizedList(new ArrayList<>()); // Iterating here can crash if a writer joins in.

After: CopyOnWriteArrayList log = new CopyOnWriteArrayList<>(); // Iteration is safe and never crashes.

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