Ich habe eine große Codebase (von mir geschrieben), die die Stack-Datenstruktur verwendet. Dies wurde aus Gründen der Bequemlichkeit verwendet und ich benutze es manchmal als Stack oder manchmal als Vector / List.
Nach einer Leistungsüberprüfung wurde jedoch entschieden, dass wir für die Synchronisierungssicherheit nicht extra bezahlen wollen. Ich muss jetzt diese Struktur durch eine nicht-synchronisierte ersetzen (und es wird oft im Code erwähnt).
Ich war froh zu entdecken, dass Apache-Sammlungen einen ArrayStack enthalten was genau das ist, was ich möchte (genauso wie Java Stack, aber nicht synchronisiert). Allerdings hat dies keine Generika als modernen Java 5 Code (was ich verwende). Und ich werde meinen Code nicht so konvertieren, dass er wie Java 1.4 aussieht.
Gibt es also einen anderen Java 5-konformen Drop-in-Ersatz für Java Stack oder muss ich meinen eigenen schreiben?
Aktualisierung:
Ich habe LinkedList mit abgestimmten "pop" / "push" Methoden verwendet.
Wenn Sie "Java 5-kompatibel" sagen - ArrayDeque<T>
kam erst in Java 6 an, klingt aber nach dem, wonach Sie suchen (natürlich mit der Schnittstelle Deque<T>
). Sie können es als einen Stapel verwenden, wenn Sie möchten, oder eine Warteschlange, wo das passender ist ... rufen Sie einfach die entsprechenden Methoden im Grunde.
In Ihrem speziellen Fall (und eigentlich nur in einem solchen Fall) kopiere und füge ich einfach die Stack-Klasse aus einer Open-Source-Java-SE-Implementierung in dein eigenes Paket ein und entferne alle synchronisierten Schlüsselwörter. Vielleicht möchtest du extends java.util.Stack
hinzufügen. Jetzt müssen Sie nur die Import-Deklarationen in Ihrem Code ändern.
Mir ist klar, dass normalerweise es keine gute Idee ist, Code zu kopieren, aber das ist der Grund, warum das nicht auf diesen Fall zutrifft:
pop()
und push()
eines Stacks für den aktuellen Code gut passt, ändert sich dies nicht nur aufgrund von Leistungsüberlegungen. Die Semantik einer Deque- oder Linked-List ist unterschiedlich (sie erlauben das Hinzufügen / Entfernen von beiden Seiten). java.util.Stack
kann nicht durch eine andere Technik wie Unterklassen (Aufruf von super
Methoden) oder Delegierung. Im Allgemeinen wäre es viel besser, java.util.Stack
so zu verwenden, als wäre es eine Schnittstelle, und nicht new Stack()
im Code zu verwenden, sondern mithilfe von Factories zu instanziieren.
Tags und Links java stack data-structures