Ich suche nach einer Sammlung, die:
Deque
/ List
- d. h. unterstützt das Einfügen von Elementen an der "Spitze" (die neuesten Elemente gehen an die Spitze) - deque.addFirst(..)
/ list.add(0, ..)
. Es könnte ein Queue
sein, aber die Iterationsreihenfolge sollte umgekehrt sein - d. H. Die zuletzt hinzugefügten Elemente sollten zuerst kommen. Ich kann LinkedBlockingDeque
übernehmen und in meine benutzerdefinierte Sammlung einbinden, die bei add
operations die Größe überprüft und die letzten Elemente verwirft. Gibt es eine bessere Option?
Ich glaube, was Sie suchen, ist ein begrenzter Stapel. Es gibt keine Core-Bibliotheksklasse, die dies tut, daher denke ich, dass dies am besten einen nicht synchronisierten Stapel (LinkedList) macht und ihn in eine synchronisierte Sammlung umwandelt, die das automatische Verwerfen und Zurückgeben von null bei leer liefert Pop. Etwas wie das:
%Vor%... Methoden wie isEmpty nach Bedarf hinzufügen, wenn Sie zB List implementieren möchten.
Die einfachste und klassische Lösung ist ein beschränkter Ringpuffer, der die ältesten Elemente außer Kraft setzt.
Die Implementierung ist ziemlich einfach. Sie benötigen einen AtomicInteger / Long für index + AtomicReferenceArray und Sie haben einen lockfreien Allzweck-Stack mit nur 2 Methoden offer/poll
, no size()
. Die meisten simultanen / lock-free Strukturen haben Schwierigkeiten mit / size (). Nicht überschreibender Stapel kann O (1) haben, aber mit Zuweisung auf put.
Etwas in der Art von:
%Vor% Letzte Anmerkung:
Mod-Operation zu haben ist eine teure und Power-of-2-Kapazität ist vorzuziehen, über &length()-1
(auch Wächter gegen langen Überlauf).
Tags und Links java collections