Ну, константный хеш-код действителен и «только» проблема производительности при использовании HashMap
/ HashSet
или другого кода, который использует его для оптимизации сравнения / поиска.
Реализация equals()
, которая всегдавозвращает false
, однако нарушает контракт равных и приведет к проблемам / неожиданному поведению со многими типами коллекций.
Из JavaDocs equals
:
Метод equals реализует отношение эквивалентности для ненулевых ссылок на объекты:
- Это рефлексивно: для любого ненулевого ссылочного значения x, x.equals (x) должен возвращать true.
- Симметрично: для любых ненулевых ссылочных значений x и y x.equals (y) должен возвращать true тогда и только тогда, когда y.equals (x) возвращает true.
- Это транзитивно: для любых ненулевых ссылочных значений x, y и z, если x.equals (y) возвращает true, а y.equals (z) возвращает true, тогда x.equals (z) должен возвращать true.
- Это согласуется: для любых ненулевых опорных значений x и y, кратных iПризывы x.equals (y) последовательно возвращают true или последовательно возвращают false, при условии что никакая информация, используемая в сравнениях сравнения объектов, не изменяется.
- Для любого ненулевого ссылочного значения x, x.equals (null)должен вернуть false.
Реализация return false
нарушает первое требование.
Из JavaDocs hashcode
:
- Не требуется, чтобы, если два объекта были неравны в соответствии с методом equals (java.lang.Object), то вызов метода hashCode для каждого из двух объектов должен давать разные целочисленные результаты.Тем не менее, программист должен знать, что выдача различных целочисленных результатов для неравных объектов может повысить производительность хеш-таблиц.
Как указано в комментариях @ Mensur Qulami , он все равно может работать правильно с HashMap
, если ваша реализация использует сравнение ссылок с ==
для оптимизации поиска узлов.
С OpenJDK 12 HashMap.getNode (int hash, Object key) :
((k = first.key) == key || (key != null && key.equals(k))))
, поэтому эта реализация проверяет равенство ссылок перед попыткой equals()
, но это не гарантируется.
Java-документы для HashMap.get
определяют это строго в терминах equals()
Более формально, если эта карта содержит отображение из ключа k взначение v такое, что (key==null ? k==null : key.equals(k))
, тогда этот метод возвращает v
;в противном случае возвращается null
.
(это эквивалентно , если , реализация equals
выполняет вышеуказанный контракт, поэтому оптимизация, выполненная OpenJDK, действительна)