Недавно я искал хорошую реализацию метода hashCode()
в Java API и просмотрел исходный код Integer
.Не ожидал этого, но hashCode()
просто возвращает поддерживаемое значение int
.
public final class Integer ... {
private final int value;
...
public int hashCode() {
return Integer.hashCode(value);
}
public static int hashCode(int value) {
return value;
}
Это действительно странно, так как есть много статей и страниц, а также пакетов, посвященных этому вопросу -как спроектировать хорошую хеш-функцию для распределения значений.
Наконец, я пришел к такому выводу:
Integer
- худший кандидат на тип данных для ключа при использовании с HashMap
, так каквсе последовательные ключи будут размещены в одной корзине.Как в примере выше.
Map<Integer, String> map = HashMap<>();
for (int i = 1; i < 10; i++) {
map.put(Integer.valueOf(i), "string" + i);
}
Есть два вопроса, на которые я не нашел ответов, когда гуглил:
- Прав ли я с моим выводом относительно
Integer
тип данных? - В случае, если это правда, почему метод
Integer's hashCode()
не реализован каким-то хитрым способом, когда используются степенная операция, простые числа, двоичное смещение?