Was ist eine einfache und schnelle Möglichkeit, einen Iterator zu erhalten, der am Anfang von List
?
Die einfachsten Versionen, die ich mir vorstellen kann, sind:
# 1:
%Vor%# 2:
%Vor% Leider erzeugen beide Versionen ein temporäres List
, was die Leistung erheblich beeinträchtigt, da ich diese Methode millionenfach in einer engen Schleife anrufe.
Gibt es noch andere Bibliotheksfunktionen, die ich dafür verwenden könnte?
Hinweis: Ich kann nicht vermeiden, über die Liste zu iterieren, da ich sie an eine Methode übergebe, die einen Iterator als Argument verwendet und diese Klasse nicht ändern kann.
Scheint als ob feature wird zur guava hinzugefügt, derzeit (ab r06) in der Beta:
%Vor% Sie wissen bereits, dass es sich um eine Liste handelt. Sie können also einfach die Methode List.subList(int fromIndex, int toIndex)
aufrufen. Gemäß der Spezifikation wird die Unterliste von der ursprünglichen Liste unterstützt, so dass es nicht wirklich ein vollwertiges List
erstellt, sondern nur eine Art Proxy-Objekt.
Dies ist ein Ort, an dem ein Dekorierer sehr gut funktioniert: Ihr Dekorator behält eine Zählung bei, die um% co_de erhöht wird %, und verwendet von control next()
.
Beispiel (absichtlich unvollständig):
%Vor%Warum nicht einfach
%Vor%Ich bin nicht sicher, warum Sie sich um die Erstellung dieser vorläufigen Liste kümmern. Es tut nichts, was ich als teuer erachten würde. In der Tat ist das Erstellen dieser Liste bei weitem billiger als das Iterieren darüber, was ich annehme, dass Sie tun.
Die Methode ArrayList.sublist(int,int)
erstellt keine Kopie der ursprünglichen Liste. Stattdessen wird eine SubList-Instanz zurückgegeben, die die ursprüngliche ArrayList umschließt. Der Iterator, der von der aus Array abgeleiteten Teilliste zurückgegeben wird, erstellt auch keine Kopie.
Ich empfehle also, ArrayList
als Basislistentyp und sublist
zu verwenden. Wenn das nicht schnell genug ist, implementieren Sie Ihre eigene Variante von ArrayList
, die eine limitedLengthIterator
-Methode implementiert. Zum Beispiel sollten Sie in der Lage sein, den Code loszuwerden, der nach gleichzeitigen Änderungen sucht.
Wenn Sie Bedenken hinsichtlich der Leistung haben, verwenden Sie keinen Iterator, verwenden Sie einen Index für ein Array. Dies wird zu einer viel besseren Leistung führen. Die ersten N Elemente eines Arrays zu erhalten ist trivial.
Diese Version erweist sich als schneller als jedes der anderen Beispiele:
%Vor% Wenn die temporäre Liste trotzdem erstellt werden muss, ist ein ArrayList
schneller als die dekorierten Listen, die von den anderen Bibliotheksmethoden zurückgegeben werden.
Ich vermute, dass ArrayList
in der VM eine spezielle Behandlung bekommt.
Vielleicht wäre das für sehr lange Listen ineffizient, aber meine Listen sind kurz (fast immer weniger als 50 Elemente).
Tags und Links java collections iterator guava