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. Вы и ваши соседи имеют одно и то же, но не одно и то же.