Odpowiedź Jona Skeeta dobrze odnosi się do dwóch scenariuszy (mapa z nullwartością, a nie nullwartoś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.
Mapsą 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ć Integerjako typu klucza, zrób to.
Ta hashCode()metoda jest bardzo wydajna, ponieważ kolizje nie są możliwe dla unikalnych intwartoś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 Stringna 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 Effectivedotyczy go.
Oto post, który szczegółowo opisuje sposób.