Страницы

Поиск по вопросам

понедельник, 3 февраля 2020 г.

Методы equals и hashcode

#java #объекты


    BlackBox object1 = new BlackBox(5, 10);
    BlackBox object2 = new BlackBox(5, 10);


    System.out.println(object1.hashCode());
    System.out.println(object2.hashCode());
    System.out.println(object1.equals(object2));

1956725890
356573597
false


Из статьи на хабре: если объекты одинаковые, то и хеш-коды одинаковые (но не наоборот,
см. правило 3)

Почему в вышеприведенном примере хеш-коды разные? Почему equals() возвращает false?
    


Ответы

Ответ 1



если объекты одинаковые, то и хеш-коды одинаковые Это правильное утверждение, только трактуете вы его неверно. Это ваша задача как программиста сделать так, чтобы хешкоды у одинаковых объектов были одинаковы (меру одинаковости выбираете и контролируете вы). Так как нельзя заранее определить, какие объекты будут равны, по умолчанию хешкодом является, емнип, указатель на объект, и в этом случае объект будет равен только себе самому. Чтобы изменить это поведение, вам нужно переопределить методы .hashcode() и .equals().

Ответ 2



Если вы хотите сравнивать объекты собственного класса вам необходимо переопределить свойство equal() в вашем классе.

Ответ 3



Загляните под капот. Советую прочитать Рихтер CLR via C# стр. 172. Ссылки и будут разными, так как это два разных объекта. BlackBox object1 = new BlackBox(5, 10); BlackBox object2 = object1; System.out.println(object1.hashCode()); System.out.println(object2.hashCode()); System.out.println(object1.equals(object2));

Комментариев нет:

Отправить комментарий