Warum nicht das Beste aus beiden Welten nutzen? Wenn Sie es nie wieder verwenden, sortieren Sie es mit einem TreeSet und initialisieren Sie eine ArrayList mit dem Inhalt
List<ComparableObject> sortedCollection =
new ArrayList<ComparableObject>(
new TreeSet<ComparableObject>(map.values()));
BEARBEITEN:
Ich habe eine Benchmark erstellt (Sie es zugreifen können pastebin.com/5pyPMJav ) testen die drei Ansätze (Arraylist + Collections.sort, TreeSet und meine Beste aus beiden Welten - Ansatz) und Mine gewinnt immer. Die Testdatei erstellt eine Karte mit 10000 Elementen, deren Werte einen absichtlich schrecklichen Vergleich haben, und dann erhält jede der drei Strategien die Möglichkeit, a) die Daten zu sortieren und b) darüber zu iterieren. Hier ist eine Beispielausgabe (Sie können sie selbst testen):
BEARBEITEN: Ich habe einen Aspekt hinzugefügt, der Aufrufe an Thingy.compareTo (Thingy) protokolliert, und ich habe auch eine neue Strategie hinzugefügt, die auf PriorityQueues basiert und viel schneller ist als jede der vorherigen Lösungen (zumindest beim Sortieren).
compareTo() calls:123490
Transformer ArrayListTransformer
Creation: 255885873 ns (0.255885873 seconds)
Iteration: 2582591 ns (0.002582591 seconds)
Item count: 10000
compareTo() calls:121665
Transformer TreeSetTransformer
Creation: 199893004 ns (0.199893004 seconds)
Iteration: 4848242 ns (0.004848242 seconds)
Item count: 10000
compareTo() calls:121665
Transformer BestOfBothWorldsTransformer
Creation: 216952504 ns (0.216952504 seconds)
Iteration: 1604604 ns (0.001604604 seconds)
Item count: 10000
compareTo() calls:18819
Transformer PriorityQueueTransformer
Creation: 35119198 ns (0.035119198 seconds)
Iteration: 2803639 ns (0.002803639 seconds)
Item count: 10000
Seltsamerweise funktioniert mein Ansatz bei der Iteration am besten (ich hätte gedacht, dass es bei der Iteration keine Unterschiede zum ArrayList-Ansatz gibt. Habe ich einen Fehler in meinem Benchmark?)
Haftungsausschluss: Ich weiß, dass dies wahrscheinlich ein schrecklicher Maßstab ist, aber es hilft Ihnen, den Punkt zu vermitteln, und ich habe ihn auf keinen Fall manipuliert, um meinen Ansatz zum Sieg zu führen.
(Der Code hat eine Abhängigkeit von Apache Commons / Lang für die Builder equals / hashcode / compareTo, aber es sollte einfach sein, ihn umzugestalten.)