Как работает метод hashCode () Java?
Java.lang.Object имеет методы, называемые hasCode(), и эти методы играют значительную роль в приложении реального времени. Объект hashCode() Object фактически является нативным методом, и реализация на самом деле не в чистой Java. Если посмотреть на источник Object Class, вы можете увидеть следующий код для hashCode.
public native int hashCode();
Это указывает на то, что hashCode - это собственная реализация, которая в определенной степени обеспечивает адрес памяти. Однако можно переопределить метод hashCode в вашем классе реализации. Родные методы являются либо внутренними, либо написанными за пределами Java в «родном» коде, то есть конкретным для данного компьютера.
Java не создает значимого хэш-кода для вас, это ваша работа как разработчик для создания полезного хэш-кода. Однако Object генерирует HashCode на основе адреса памяти экземпляра объекта. Большинство классов (особенно Collection API) должны реализовывать собственный HashCode (а по контракту - собственный метод equals). Значение, возвращаемое hashCode(), никоим образом не гарантируется как адрес памяти объекта. Согласно Java API, вычисление hashcode основано на 32-битном внутреннем адресе JVM (Java Virtual Machine) объекта. Верно, что объект перемещается во время выполнения. Но hashcode не меняется.
Пример
Student student1 = new Student(); person1.setName("John"); Student student2 = new Student(); person2.setName("Doe"); Student student3 = student2;
В приведенном выше случае student1.hashCode не будет равен student2.hashCode, потому что адреса памяти этих двух объектов не совпадают. Но student2.hashCode будет равен student3, потому что они указывают на один и тот же объект. Поэтому, если вам нужно использовать метод hashCode для ваших объектов, вы должны реализовать его самостоятельно.
Метод HashCode и Equals в Java
В Java каждый объект имеет доступ к методу equals(), поскольку он наследуется от класса Object. Если два объекта равны в соответствии с методом equals (Object), то вызов метода hashCode для каждого из двух объектов должен давать одинаковый целочисленный результат. Вы должны переопределить hashCode() в каждом классе, который переопределяет equals(). Подробнее о ....
Источник: http://net-informations.com/Java/cJava/hash.htm