Java-hashmaps ohne Wert?
Sagen wir, ich wollen, die Worte in einer Daten-Struktur, und ich will Konstante Zeit-lookups, um zu sehen, wenn das Wort in dieser Daten Struktur. Alles was ich will zu tun ist, um zu sehen, ob das Wort existiert. Würde ich eine HashMap
(containsKey()) für diesen? HashMap
s Taste->Wert-Paarungen, aber in meinem Fall habe ich nicht einen Wert haben. Natürlich könnte ich mit null für den Wert, aber auch null nimmt Platz. Es scheint, wie es sein sollte, eine bessere Datenstruktur für diese Anwendung.
Die Sammlung könnte möglicherweise verwendet werden, die von mehreren threads, aber da die enthaltenen Objekte von der collection nicht ändern würde, ich glaube nicht, dass ich eine Synchronisierung/Parallelität Anforderung.
Kann jemand mir helfen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden HashSet statt. Es ist eine hash-Implementierung von Set, die in Erster Linie für genau das, was Sie beschreiben (eine ungeordnete Gruppe von Elementen).
Werden Sie wahrscheinlich wollen, zu einem java.util.Set. Implementierungen java.util.HashSet, die den Satz entspricht der HashMap.
Selbst wenn die Objekte in der collection ändern sich nicht, müssen Sie eventuell noch die Synchronisation. Werden neue Objekte Hinzugefügt werden müssen, um den Satz nach dem Satz mit der übergabe an einen anderen thread? Wenn dem so ist, können Sie Sammlungen.synchronizedSet() um den Satz thread-safe.
Wenn Sie eine Karte mit Werten, und Sie haben einige code, der nur behandeln will, die Karte als Set, die Sie verwenden können, Anzeigen.entrySet() (obwohl im Hinterkopf behalten, dass entrySet liefert einen view der Schlüssel in der Karte, wenn die Karte verändert, wird die Karte geändert werden kann durch das set zurückgegeben entrySet).
Würden Sie verwenden in der Regel die Umsetzung der Set, und die meisten in der Regel HashSet. Wenn Sie nicht benötigen gleichzeitigen Zugriff, dann ConcurrentHashSet bietet ein drop-in-replacement, sichere, gleichzeitige Zugriffe, einschließlich der sicheren iteration über die Menge.
Ich würde empfehlen in jedem Fall sich auf ihn als einfach nur einen Satz im gesamten code, außer in der einen Stelle, wo Sie es konstruieren; so ist es leichter zu fallen, eine Umsetzung für die anderen, wenn Sie später benötigen.
Auch wenn der Satz nur-lese -, wenn es von einem anderen thread als dem, der es schafft, Sie müssen denken sicher Veröffentlichung (das heißt, machen Sie sicher, dass jeder andere thread sieht das set in einem konsistenten Zustand befinden: denken Sie daran, jede Erinnerung schreibt, auch in Konstruktoren sind nicht garantiert verfügbar gemacht werden, um andere threads, wenn oder in der otder, die Sie erwarten, wenn Sie die Schritte, um dies sicherzustellen). Dies kann durch die beiden folgenden:
Können Sie helfen, sicherzustellen, dass die letzteren durch die Nutzung der Sammlungen.unmodifiableSet () - wrapper. Dies gibt Ihnen eine unveränderliche Sicht auf die gegebenen Satz-- so, sofern keine anderen "normalen" Referenz-set entgeht, du bist sicher.
Möchten Sie eine Sammlung der Implementierung der Set-Schnittstelle, wahrscheinlich HashSet zu Holen Sie sich die Leistung, die Sie angegeben. Sehen http://java.sun.com/javase/6/docs/api/java/util/Set.html
Andere als
Set
s, in einigen Fällen möchten Sie vielleicht zu konvertierenMap
in eineSet
mitCollections.newSetFromMap(Map<E,Boolean>)
(einigeMap
s verbietennull
Werte, daher derBoolean
).als jeder sagte, HashSet ist wahrscheinlich die einfachste Lösung, aber Sie müssen nicht Konstante Zeit-lookup in eine HashSet (da Einträge können verkettet werden), und Sie speichern eine dummy-Objekt (immer die gleichen) für jeden Eintrag...
Informationen hier eine Liste von Datenstrukturen vielleicht findest du ja eine, die besser zu Ihren Bedürfnissen passt.