Die Antwort von Jon Skeet spricht die beiden Szenarien (Karte mit nullWert und nicht nullWert) 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.
Mapsind 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 IntegerSchlüsseltyp als verwenden können, tun Sie dies.
Die hashCode()Methode ist sehr effizient, da die Kollisionen für eindeutige intWerte 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 Stringer beispielsweise häufig verwendet wird Map, können einige Kollisionen auftreten, aber von 1 Tausend bis zu einigen Tausend Objekten in der Mapsollten 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 Effectivebeziehen.
Hier ist ein Beitrag , der den Weg beschreibt.