Ответ Джона Скита хорошо обращается к двум сценариям (карта со null
значением и не null
значением) эффективным способом.
О количестве записей и проблем эффективности, я хотел бы добавить кое-что.
У меня есть HashMap с, скажем, 1000 записей, и я смотрю на повышение эффективности. Если к HashMap обращаются очень часто, то проверка существования ключа при каждом доступе приведет к большим издержкам.
Карта с 1000 записей не является огромной картой.
А также карта с 5.000 или 10.000 записей.
Map
предназначены для быстрого поиска с такими размерами.
Теперь предполагается, что hashCode()
ключи карты обеспечивают хорошее распределение.
Если вы можете использовать в Integer
качестве типа ключа, сделайте это.
Его hashCode()
метод очень эффективен, поскольку столкновения невозможны для уникальных int
значений:
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;
}
...
}
Если для ключа вам нужно использовать другой встроенный тип, как, String
например, который часто используется в Map
, у вас могут быть некоторые коллизии, но от 1 тысячи до нескольких тысяч объектов в Map
, у вас должно быть очень мало таких как String.hashCode()
метод обеспечивает хорошее распределение.
Если вы используете пользовательский тип, переопределите hashCode()
и equals()
правильно и убедитесь, что в целом это hashCode()
обеспечивает справедливое распределение.
Вы можете обратиться к пункту 9 Java Effective
ссылки.
Вот пост, который подробно описывает путь.