hashCode и equals для новичка, от 0 до эксперта

227
29 декабря 2017, 00:09

Помогите разобраться с этими "функциями", не очень понял зачем они нужны, как они работают, как они связаны с коллекциями, читал тот же Хабр с места не двинулся :/, я новичок:/, именно в Java, а то мой пост определяют как дубликат, хотя другой похожий вопрос вообще по Андроид разработке, помогите пожалуйста, ну очень прошу

Answer 1

Метод equals используется для сравнивания объектов.

Если сравнивать через == то будет выяснено, лежат ли данные, хранящиеся в сравниваемых переменных в одной и той же области памяти. Иногда это не то, что нужно. Например у вас есть 2 объекта одного класса User - один вы из БД достали, другой с сети пришёл. Они точно не будут лежать в одной области памяти, т.к. были созданы в разных местах через конструктор. Но вам может быть надо сделать так, чтобы программа определяла их как одинаковые, сравнивая не физическое их положение на диске, но значение их ID, кое хранится в их поле.

Именно для этого и нужен метод equals - в нём вы указываете, что переменные равны друг другу не только, если на одну и ту же область в памяти ссылаются, но и если их ID равны.

В случае коллекций этот метод нужен для, например, выяснения содержит ли коллекция к-л объект. Если не переопределить метод equals, то будут сравниваться ссылки на область в памяти, а не ID и вы получите false в неожиданных случаях. (В исходниках просто цикл обхода всей коллекции с вызовом метода equals происходит)

Метод же hashCode нужен для некоторых коллекций (HashMap, HashSet etc), которые, вызывая его, определяют в какой из внутренних массивов положить объект. Если его не переопределять наравне с equals вы можете столкнуться с неожиданным поведением таких коллекций. При этом нельзя также и одним только hashCode ограничиться - т.к. он типа int то максимальное кол-во уникальных значений меньше 5 млрд, что не всегда достаточно.

READ ALSO
Разделить легенду из одного div'a на 3 div'a

Разделить легенду из одного div'a на 3 div'a

Можно ли в легенде, разделить все содержимое <div> со своими классами? Сейчас сгенерированна своя легенда и пункт ее выглядит примерно так:

250
При значении инпута появляется блок

При значении инпута появляется блок

При получении значения из inpit, нужно чтоб появлялся еще один блок, если это значение равно 2 то появляется второй блок, если 3-ом то третий...

216
Не удаляется класс с помощь которого выбран элемент

Не удаляется класс с помощь которого выбран элемент

Допустим мы выбираем элемент var $el = $('hi');

234