Ответ Джона Скита эффективно обращается к двум сценариям (отображение со значением 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
ссылается на него.
Вот сообщение , в котором подробно описан путь.