kosnvny / absolutely_new_lab3

0 stars 0 forks source link

(C) неправильный equals() #6

Open G0ld3nDr4g0n3301 opened 9 months ago

G0ld3nDr4g0n3301 commented 9 months ago

У тебя в нескольких классах(например Space) есть метод equals,в котором вообще нет проверки по хэш-коду.Это неправильно. Объясню на примере,который мне привел один великий человек: допустим у тебя есть массив из 1000000000 объектов определённого класса. И у тебя есть объект-образец. Ты хочешь найти все объекты массива,которые равны образцу. Ты будешь полностью сравнивать все эти дофигилиард объектов?Нет. Мы посчитаем хэшкод первого объекта(а он считается в разы быстрее полного сравнения) и если хэшкоды не равны - то объекты 100% не равны. Потом то же самое со вторым объектом массива,и т.д. . Так мы сэкономим очень много времени при сравнении этих объектов. Почему нельзя судить о равенстве объектов из-за равенства их хэш кодов? Ну,хэш-код - это математическая функция. Так вот бывает такое,что несмотря на то,что мы подаём разные X, Y получается одинаковый.С хэш кодами бывает такая же ситуация, это называется "коллизия". В общем: добавь в equals проверку хэшкода.

P.S. Если что issues можно закрывать - Внизу есть кнопка Close issue

Vediusse commented 9 months ago

Я как человек, который очень, связан с этим одним великим человек мб даже я и есть

Поправка: в equals не должна быть проверка на hashCode - как минимум необязательна.

Пример описанный в этом issue довольно правильный - но это лишь абстрактный пример чем отличается сравнение по hashCode и equals - оно не подразумевает добавлять в каждый equals хэш ( это даже лишнее как по мне потому что если нужно будет сравнить пять шесть объектов то проверка через hash очень даже лишняя)

G0ld3nDr4g0n3301 commented 9 months ago

Я как человек, который очень, связан с этим одним великим человек мб даже я и есть

Поправка: в equals не должна быть проверка на hashCode - как минимум необязательна.

Пример описанный в этом issue довольно правильный - но это лишь абстрактный пример чем отличается сравнение по hashCode и equals - оно не подразумевает добавлять в каждый equals хэш ( это даже лишнее как по мне потому что если нужно будет сравнить пять шесть объектов то проверка через hash очень даже лишняя)

Нет,на это требуется очень мало ресурсов,но оно позволяет очень эффективно отсеивать не равные объекты. В каждый иквалс стоит добавлять хэш,так как даже если объектов для сравнения не много - время,которое ты выигрываешь окупает возможное время на подсчёт хэша. Единственное исключение - если ты почти постоянно сравниваешь с равными объектами,но заранее ты знать этого не можешь. Поэтому это очень полезно и в 99% ускорит сравнение в твоей программе.

Vediusse commented 9 months ago

Ты не прав - эту логику для сравнения ты должен вынести за метод equals а не исполнять его в equals

G0ld3nDr4g0n3301 commented 9 months ago

Ты не прав - эту логику для сравнения ты должен вынести за метод equals а не исполнять его в equals

Ты не прав. Эта логика напрямую связана со сравнением и должна запускаться при сравнении каждого объекта.Поэтому она должна быть именно в иквалс.

Vediusse commented 9 months ago

Это глупость. equals - зачасту используется просто для сравнения двух объектов в блоке if - зачем там две проверки на hash и потом на полное соответствие полей - ведь можно просто на полное соответствие полей

Если нужно реализовывать логику как в абстратном примере( который нужен просто для понятия разные между hashCOde и equals) то нужно создать отдельну функциуй

G0ld3nDr4g0n3301 commented 9 months ago

Это глупость. equals - зачасту используется просто для сравнения двух объектов в блоке if - зачем там две проверки на hash и потом на полное соответствие полей - ведь можно просто на полное соответствие полей

Если нужно реализовывать логику как в абстратном примере( который нужен просто для понятия разные между hashCOde и equals) то нужно создать отдельну функциуй

Почему две проверки на хэш? Она там одна должна быть. Сейчас 0. Зачем нам обязательная проверка? Чтобы не тратить время на точно не равные объекты,а только на коллизии. Как я уже сказал,делается она очень быстро. У неё одни плюсы и очень маловероятный минус - она будет полезна в каждой проверке,не обязательно как в примере с массивом. Просто в этом примере выгода просто ощутимее всего.

Vediusse commented 9 months ago

Может ты и прав - что такая проверка вещь крутая - но эту логику нужно выносить за equals если она понадобится.

Лично я хочу сказать, что:

в большинстве случаев equals используется в блоках if(obj.quals(e)){} в них проверка на hash в ней будет излишней