Java два объекта Set - hashCode() одинаковы, но.equals() завершается ошибкой

У меня есть два набора (LinkedHashSet) пользовательских объектов, который переопределяет методы hashCode() и equals().

При сравнении этих двух наборов метод equal() завершается ошибкой, даже если хеш-коды одинаковы.

    System.out.println("cmContacts.equals(cm2Contacts):" + cmContacts.equals(cm2Contacts));
    System.out.println("cm2Contacts.equals(cmContacts):" + cm2Contacts.equals(cmContacts));
    System.out.println("compare hash codes:" + ( cm2Contacts.hashCode() == cmContacts.hashCode() ) );        

Это возвращает:

cmContacts.equals (cm2Contacts): ложный

cm2Contacts.equals(cmContacts): ложный

сравнить хэш-коды: правда

Согласно документации, если хеш-коды одинаковы, метод equals должен возвращать true.

Хеш-код набора определяется как сумма хеш-кодов элементов в наборе, где хеш-код нулевого элемента определяется как ноль. Это гарантирует, что s1.equals (s2) подразумевает, что s1.hashCode()==s2.hashCode() для любых двух наборов s1 и s2, как того требует общий контракт Object.hashCode().

https://docs.oracle.com/javase/7/docs/api/java/util/Set.html

Есть идеи, почему это происходит?

2 ответа

Решение

Вы получаете это задом наперед: если два объекта равны, они должны иметь одинаковый хэш-код. Наличие одинакового хеш-кода не означает, что объекты должны быть равны.

Так же hashcode() не значит equals,

Вы можете сравнить это с ZipCode. Вы и ваши соседи имеют одно и то же, но не одно и то же.

Другие вопросы по тегам