Die Antwort von Jon Skeet spricht die beiden Szenarien (Karte mit null
Wert und nicht null
Wert) auf effiziente Weise gut an.
Über die Nummerneinträge und das Effizienzproblem möchte ich noch etwas hinzufügen.
Ich habe eine HashMap mit beispielsweise 1.000 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.
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 eindeutige int
Werte nicht möglich sind:
public final class Integer extends Number implements Comparable<Integer> {
...
@Override
public int hashCode() {
return Integer.hashCode(value);
}
public static int hashCode(int value) {
return value;
}
...
}
Wenn Sie für den Schlüssel einen anderen integrierten Typ verwenden müssen, wie String
er beispielsweise häufig verwendet wird Map
, können einige Kollisionen auftreten, aber von 1 Tausend bis zu einigen Tausend Objekten in der Map
sollten Sie nur sehr wenige davon als String.hashCode()
Methode verwenden bietet eine gute Verteilung.
Wenn Sie einen benutzerdefinierten Typ verwenden, überschreiben hashCode()
und equals()
korrigieren Sie ihn und stellen Sie insgesamt sicher, dass hashCode()
eine faire Verteilung gewährleistet ist .
Sie können sich auf Punkt 9 Java Effective
beziehen.
Hier ist ein Beitrag , der den Weg beschreibt.