Если у класса Point{int x, y;} реализовать метод equals(Object that) {(return this.x == that.x && this.y == that.y)}, но сделать хэш код в виде int hashCode() {return x;}, то будут ли корректно такие точки помещаться и извлекаться из HashSet?
При возникновении коллизии в
HashSet
использует HashMap
для хранения элементов. При добавлении элемента в HashMap
вычисляется хэш код, по которому определяется позиция в массиве, куда будет вставлен новый элемент. У всех экземпляров класса Point
хэш код будет одинаковым для всех объектов с одинаковым x
, что приведёт к вырождению хэш таблицы в список.При возникновении коллизии в
HashMap
осуществляется проверка на наличие элемента в списке: e.hash == hash && ((k = e.key) == key || key.equals(k))
. Если элемент найден, то его значение перезаписывается. В нашем случае для разных объектов метод equals()
будет возвращать false
. Соответственно новый элемент будет успешно добавлен в HashSet
. Извлечение элемента также будет осуществляться успешно. Но производительность такого кода будет невысокой и преимущества хэш таблиц использоваться не будут.