Wenn ich ein Objekt habe, das die Map-Schnittstelle in Java implementiert, und ich möchte über jedes darin enthaltene Paar iterieren, was ist der effizienteste Weg, die Map zu durchlaufen?
Wenn die Effizienz der Tastenschleife für Ihre Anwendung Priorität hat, dann wählen Sie eine Map
Implementierung, die die Schlüssel in der von Ihnen gewünschten Reihenfolge verwaltet.
Hängt die Reihenfolge der Elemente von der spezifischen Kartenimplementierung ab, die ich für die Schnittstelle habe?
Ja, absolut.
- Einige
Map
Implementierungen versprechen eine bestimmte Iterationsreihenfolge, andere nicht.
- Verschiedene Implementierungen von
Map
eine andere Reihenfolge der Schlüssel-Wert-Paare beibehalten.
Siehe diese von mir erstellte Tabelle mit einer Zusammenfassung der verschiedenen Map
Implementierungen, die mit Java 11 gebündelt werden. Beachten Sie insbesondere die Iterationsreihenfolge Spalte. Klicken/Tippen Sie zum Zoomen.
Sie können sehen, dass es vier Map
Implementierungen, die eine Ordnung aufrechterhalten :
TreeMap
ConcurrentSkipListMap
LinkedHashMap
EnumMap
NavigableMap
Schnittstelle
Zwei davon implementieren die NavigableMap
Schnittstelle: TreeMap
& ConcurrentSkipListMap
.
Die älteren SortedMap
Schnittstelle wird durch das neuere NavigableMap
Schnittstelle. Möglicherweise finden Sie jedoch Implementierungen von Drittanbietern, die nur die ältere Schnittstelle implementieren.
Natürliche Ordnung
Wenn Sie eine Map
die ihre Paare nach der "natürlichen Reihenfolge" des Schlüssels anordnet, verwenden Sie TreeMap
ou ConcurrentSkipListMap
. Der Begriff "natürliche Ordnung" bezeichnet die Klasse der Schlüssel, die Comparable
. Der Wert, der von der compareTo
Methode wird zum Vergleich bei der Sortierung verwendet.
Individuelle Bestellung
Wenn Sie eine benutzerdefinierte Sortierroutine für Ihre Schlüssel angeben möchten, die zur Aufrechterhaltung einer sortierten Reihenfolge verwendet werden soll, übergeben Sie eine Comparator
Implementierung, die der Klasse Ihrer Schlüssel entspricht. Verwenden Sie entweder TreeMap
ou ConcurrentSkipListMap
, vorbei an Ihrem Comparator
.
Ursprünglicher Einfügeauftrag
Wenn Sie möchten, dass die Paare Ihrer Karte in ihrer ursprünglichen Reihenfolge, in der Sie sie in die Karte eingefügt haben, beibehalten werden, verwenden Sie LinkedHashMap
.
Reihenfolge der Enum-Definitionen
Wenn Sie eine Aufzählung verwenden, wie z. B. DayOfWeek
ou Month
als Ihre Schlüssel, verwenden Sie die EnumMap
Klasse. Diese Klasse ist nicht nur sehr Das Programm ist so optimiert, dass es sehr wenig Speicherplatz benötigt und sehr schnell läuft. Es verwaltet Ihre Paare in der durch die Aufzählung definierten Reihenfolge. Für DayOfWeek
zum Beispiel der Schlüssel von DayOfWeek.MONDAY
wird bei der Iteration zuerst gefunden, und der Schlüssel von DayOfWeek.SUNDAY
werden die letzten sein.
Andere Überlegungen
Bei der Auswahl eines Map
Umsetzung, auch berücksichtigen:
- NULLen. Einige Implementierungen verbieten/akzeptieren einen NULL-Wert als Schlüssel und/oder Wert.
- Gleichzeitigkeit. Wenn Sie die Map threadübergreifend bearbeiten, müssen Sie eine Implementierung verwenden, die Gleichzeitigkeit unterstützt. Oder verpacken Sie die Map mit
Collections::synchronizedMap
(weniger wünschenswert).
Beide Überlegungen sind in der obigen grafischen Tabelle enthalten.
46 Stimmen
In Java 8 mit Lambda-Ausdruck: stackoverflow.com/a/25616206/1503859
5 Stimmen
Java 8: stackoverflow.com/questions/46898/