example - java performance optimierung




Java-Klasse, die Map implementiert und die Reihenfolge der Anzeigen beibehält? (6)

Ich suche nach einer Klasse in Java, die Schlüssel-Wert-Zuordnung hat, aber ohne Hashes zu verwenden. Hier ist, was ich gerade mache:

  1. Fügen Sie Werte zu einer Hashtable .
  2. Ruft einen Iterator für Hashtable.entrySet() .
  3. Iteriere durch alle Werte und:
    1. Map.Entry einen Map.Entry für den Iterator.
    2. Erstellen Sie ein Objekt vom Typ Module (eine benutzerdefinierte Klasse) basierend auf dem Wert.
    3. Fügen Sie die Klasse einem JPanel hinzu.
  4. Zeige das Panel.

Das Problem dabei ist, dass ich keine Kontrolle über die Reihenfolge habe, in der ich die Werte zurückbekomme, so dass ich die Werte in der gegebenen Reihenfolge nicht anzeigen kann (ohne die Reihenfolge hart zu codieren).

Ich würde dafür eine ArrayList oder Vector , aber später im Code muss ich das Module Objekt für einen bestimmten Schlüssel greifen, was ich mit einer ArrayList oder Vector nicht tun kann.

Kennt jemand eine freie / Open-Source-Java-Klasse, die dies tut, oder eine Möglichkeit, Werte aus einer Hashtable basierend darauf zu erhalten, wann sie hinzugefügt wurden?

Vielen Dank!


Ich schlage eine LinkedHashMap oder eine TreeMap . Eine LinkedHashMap behält die Schlüssel in der Reihenfolge bei, in der sie eingefügt wurden, während eine TreeMap über einen Comparator oder die natürliche Comparable Reihenfolge der Elemente sortiert TreeMap .

Da die Elemente nicht sortiert werden LinkedHashMap sollte LinkedHashMap in den meisten Fällen schneller sein. TreeMap hat die O(log n) -Leistung für containsKey , get , put und remove gemäß den Javadocs, während LinkedHashMap für jedes O(1) .

Wenn Ihre API nur eine vorhersagbare Sortierreihenfolge im Gegensatz zu einer bestimmten Sortierreihenfolge erwartet, sollten Sie die Schnittstellen verwenden, die diese beiden Klassen implementieren, NavigableMap oder SortedMap . Dies ermöglicht es Ihnen, bestimmte Implementierungen nicht in Ihre API zu verlieren und nachher zu einer dieser spezifischen Klassen oder einer komplett anderen Implementierung zu wechseln.


Ich weiß nicht, ob es Open Source ist, aber nach ein wenig googeln fand ich diese Implementierung von Map mit ArrayList . Es scheint Java vor 1.5 zu sein, also solltest du es vielleicht generisch machen, was einfach sein sollte. Beachten Sie, dass diese Implementierung einen O (N) -Zugang hat, aber das sollte kein Problem sein, wenn Sie nicht Hunderte von Widgets zu Ihrem JPanel hinzufügen, was Sie ohnehin nicht tun sollten.


Sie können LinkedHashMap für die Hauptreihenfolge in Map verwenden

Die wichtigsten Punkte der Java-Klasse LinkedHashMap sind:

  1. Es enthält nur einzelne Elemente.
  2. Eine LinkedHashMap enthält Werte basierend auf dem Schlüssel 3. Sie kann einen Nullschlüssel und mehrere Nullwerte haben. 4. Es ist dasselbe, wie HashMap stattdessen den Anzeigenauftrag beibehält

Öffentliche Klasse LinkedHashMap erweitert HashMap implementiert Map

Wenn Sie jedoch Werte in der Karte mit einem benutzerdefinierten Objekt oder einem beliebigen primitiven Datentypschlüssel sortieren möchten, sollten Sie TreeMap verwenden . Weitere Informationen finden Sie unter diesem Link


Sie können eine Map (für schnelle Suche) und eine List (für Reihenfolge) LinkedHashMap aber eine LinkedHashMap kann die einfachste sein. Sie können auch eine SortedMap zB TreeMap versuchen, die eine beliebige Reihenfolge haben.


Wann immer ich die natürliche Reihenfolge der Dinge, die im EnumMap bekannt sind, beibehalten muss, verwende ich eine EnumMap

Die Schlüssel werden enums sein und Sie können sie in beliebiger Reihenfolge einfügen, aber wenn Sie iterieren, iteriert sie in der enum-Reihenfolge (die natürliche Reihenfolge).

Auch bei Verwendung von EnumMap sollte es keine Kollisionen geben, die effizienter sein könnten.

Ich finde wirklich, dass die Verwendung von enumMap für sauber lesbaren Code sorgt. Hier ist ein example


Wenn eine unveränderliche Karte Ihren Anforderungen entspricht, dann gibt es eine Bibliothek von Google namens guava (siehe auch Guava-Fragen )

guava bietet eine ImmutableMap mit einer zuverlässigen benutzerspezifischen Iterationsreihenfolge. Diese ImmutableMap hat eine O (1) -Leistung für containsKey, get. Offensichtlich werden put und remove nicht unterstützt.

ImmutableMap Objekte werden mithilfe der eleganten statischen Convenience-Methoden of() und copyOf() oder einem Builder Objekt erstellt.





key-value