Ist eine Überprüfung der Schlüsselexistenz in HashMap immer erforderlich?
Ich habe eine HashMap mit beispielsweise 1000 Einträgen und möchte die Effizienz verbessern. Wenn sehr häufig auf die HashMap zugegriffen wird, führt die Überprüfung der Schlüsselexistenz bei jedem Zugriff zu einem hohen Overhead. Wenn der Schlüssel nicht vorhanden ist und daher eine Ausnahme auftritt, kann ich die Ausnahme abfangen. (wenn ich weiß, dass dies selten passieren wird). Dadurch wird der Zugriff auf die HashMap um die Hälfte reduziert.
Dies ist möglicherweise keine gute Programmierpraxis, hilft mir jedoch dabei, die Anzahl der Zugriffe zu verringern. Oder fehlt mir hier etwas?
[ Update ] Ich habe keine Nullwerte in der HashMap.
Antworten:
Speichern Sie jemals einen Nullwert? Wenn nicht, können Sie einfach Folgendes tun:
Andernfalls Sie könnten nur die Existenz , wenn Sie einen Nullwert zurück erhalten:
quelle
get
ist dies in Ordnung und vermeidet zwei Suchvorgänge, wenn Sie den Wert ebenfalls benötigen.if(value!=null || map.containsKey(key))
für den zweiten Teil schreiben . Zumindest, wenn Sie dasselbe tun möchten - kein wiederholter Code. Es wird aufgrund eines Kurzschlusses funktionieren .Sie erhalten nichts, wenn Sie überprüfen, ob der Schlüssel vorhanden ist. Dies ist der Code von
HashMap
:Überprüfen Sie einfach, ob sich der Rückgabewert für von
get()
unterscheidetnull
.Dies ist der HashMap-Quellcode.
Ressourcen:
HashMap-QuellcodeSchlechterquelle
Besser ist es zu benutzen
containsKey
Methode von zu verwendenHashMap
. Morgen wird jemand der Karte null hinzufügen. Sie sollten zwischen Schlüsselpräsenz und Schlüssel mit dem Wert Null unterscheiden.quelle
null
alles zusammen gespeichert wird.Meinst du, dass du Code wie hast?
überall ? Dann sollten Sie einfach prüfen, ob
map.get(key)
null zurückgegeben wurde und das wars. Übrigens löst HashMap keine Ausnahmen für fehlende Schlüssel aus, sondern gibt stattdessen null zurück. Der einzige Fall, in dem diescontainsKey
erforderlich ist, ist das Speichern von Nullwerten, um zwischen einem Nullwert und einem fehlenden Wert zu unterscheiden. Dies wird jedoch normalerweise als schlechte Vorgehensweise angesehen.quelle
Nur
containsKey()
zur Klarheit verwenden. Es ist schnell und hält den Code sauber und lesbar. Der springende Punkt beiHashMap
s ist, dass die Schlüsselsuche schnell ist. Stellen Sie einfach sicher, dass diehashCode()
undequals()
ordnungsgemäß implementiert sind.quelle
quelle
Sie können die
computeIfAbsent()
Methode auch in derHashMap
Klasse verwenden.Im folgenden Beispiel wird
map
eine Liste von Transaktionen (Ganzzahlen) gespeichert, die auf den Schlüssel (den Namen des Bankkontos) angewendet werden. Um 2 Transaktionen von100
und200
zu hinzufügen , könnenchecking_account
Sie schreiben:Auf diese Weise müssen Sie nicht überprüfen, ob der Schlüssel
checking_account
vorhanden ist oder nicht.computeIfAbsent()
.Wirklich elegant! 👍
quelle
Normalerweise benutze ich die Redewendung
Dies bedeutet, dass Sie die Karte nur zweimal treffen, wenn der Schlüssel fehlt
quelle
quelle
Die Antwort von Jon Skeet spricht die beiden Szenarien (Karte mit
null
Wert und nichtnull
Wert) auf effiziente Weise gut an.Über die Nummerneinträge und das Effizienzproblem möchte ich noch etwas hinzufügen.
Eine Karte mit 1.000 Einträgen ist keine riesige Karte.
Sowie eine Karte mit 5.000 oder 10.000 Einträgen.
Map
sind so konzipiert, dass sie mit solchen Abmessungen schnell abgerufen werden können.Nun wird davon ausgegangen, dass
hashCode()
der Kartenschlüssel eine gute Verteilung bietet.Wenn Sie einen
Integer
Schlüsseltyp als verwenden können, tun Sie dies.Die
hashCode()
Methode ist sehr effizient, da die Kollisionen für eindeutigeint
Werte nicht möglich sind:Wenn Sie für den Schlüssel einen anderen integrierten Typ verwenden müssen, wie
String
er beispielsweise häufig verwendet wirdMap
, können einige Kollisionen auftreten, aber von 1 Tausend bis zu einigen Tausend Objekten in derMap
sollten Sie nur sehr wenige davon alsString.hashCode()
Methode verwenden bietet eine gute Verteilung.Wenn Sie einen benutzerdefinierten Typ verwenden, überschreiben
hashCode()
undequals()
korrigieren Sie ihn und stellen Sie insgesamt sicher, dasshashCode()
eine faire Verteilung gewährleistet ist .Sie können sich auf Punkt 9
Java Effective
beziehen.Hier ist ein Beitrag , der den Weg beschreibt.
quelle