Odpowiedź Jona Skeeta dobrze odnosi się do dwóch scenariuszy (mapa z null
wartością, a nie null
wartością) w efektywny sposób.
Jeśli chodzi o wpisy liczbowe i problem z wydajnością, chciałbym coś dodać.
Mam HashMap z, powiedzmy, 1000 pozycji i szukam poprawy wydajności. Jeśli dostęp do HashMap jest uzyskiwany bardzo często, sprawdzanie istnienia klucza przy każdym dostępie spowoduje duże obciążenie.
Mapa z 1000 wpisów nie jest wielką mapą.
Jak również mapa z 5.000 lub 10.000 wpisów.
Map
są zaprojektowane do szybkiego wyszukiwania przy takich wymiarach.
Teraz zakłada się, że hashCode()
z klawiszy mapy zapewnia dobrą dystrybucję.
Jeśli możesz użyć Integer
jako typu klucza, zrób to.
Ta hashCode()
metoda jest bardzo wydajna, ponieważ kolizje nie są możliwe dla unikalnych int
wartości:
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;
}
...
}
Jeśli dla klucza musisz użyć innego wbudowanego typu, jak String
na przykład często używany Map
, możesz mieć pewne kolizje, ale od 1 tysiąca do kilku tysięcy obiektów w Map
, powinieneś mieć ich bardzo mało jako String.hashCode()
metodę zapewnia dobrą dystrybucję.
Jeśli używasz niestandardowego typu, zastąp hashCode()
i equals()
poprawnie, i upewnij się, że ogólnie hashCode()
zapewnia to sprawiedliwą dystrybucję.
Możesz odnieść się do punktu 9, Java Effective
dotyczy go.
Oto post, który szczegółowo opisuje sposób.