В прошлой заметке мы говорили о HashMap, hashcode() и немного equals().
Краткое содержание: записывая пару ключ-значение (запись) в HashMap, мы помещаем ее в одну из ячеек (бакет) массива. То, в какую именно ячейку будет помещена запись (индекс ячейки в массиве) определяется по значению hashcode() ключа. Поскольку в один бакет может быть помещено несколько записей, то в бакет записываются не сами записи, а содержащие их связные списки.
В HashMap могут быть помещены записи только с уникальными ключами. Уникальность определяется методом equals(). То есть если
new Integer(1).equals(new Integer(1)); - вернул true - объекты равны.
Чтобы вся эта система корректно работала, необходимо соблюдать 2 правила (и пожалуйста, дальше - читать обязательно, потому что именно этот вопрос любят задавать на собеседованиях):
1. равные объекты должны иметь один и тот же hashcode
то есть, если equals - true, hashcode() возвращает одинаковое число
2. объекты, имеющие разный hashcode - неравны
то есть если hashcode() возвращает разные числа, equals обязано вернуть false
Почему соблюдать эти правила необходимо?
Краткое содержание: записывая пару ключ-значение (запись) в HashMap, мы помещаем ее в одну из ячеек (бакет) массива. То, в какую именно ячейку будет помещена запись (индекс ячейки в массиве) определяется по значению hashcode() ключа. Поскольку в один бакет может быть помещено несколько записей, то в бакет записываются не сами записи, а содержащие их связные списки.
В HashMap могут быть помещены записи только с уникальными ключами. Уникальность определяется методом equals(). То есть если
new Integer(1).equals(new Integer(1)); - вернул true - объекты равны.
Чтобы вся эта система корректно работала, необходимо соблюдать 2 правила (и пожалуйста, дальше - читать обязательно, потому что именно этот вопрос любят задавать на собеседованиях):
1. равные объекты должны иметь один и тот же hashcode
то есть, если equals - true, hashcode() возвращает одинаковое число
2. объекты, имеющие разный hashcode - неравны
то есть если hashcode() возвращает разные числа, equals обязано вернуть false
Почему соблюдать эти правила необходимо?