Мне любопытно, как Java генерирует значения хэш-функции при помощи хэш-кода () метод Объектного API?
Java не генерирует hashCode(), т.е. здесь ничего автоматического не происходит. Однако, Object
генерирует HashCode по адресу памяти экземпляра объекта. Большинство классов (особенно если вы собираетесь использовать его в любом из API Collection
) должны реализовать свой собственный HashCode (и по договору свой собственный метод equals).
hashCode()
из Object
на самом деле является родным методом, а реализация на самом деле не является чистой Java. Теперь, что касается того, как он работает, ответ Тома Хоутина отлично его объясняет:
Многие будут утверждать, что
Object.hashCode
вернёт адрес объектного представления в памяти. В современных реализациях объекты фактически перемещаются в памяти. Вместо этого используется область заголовка объекта для хранения значения, которое может быть лениво выведено из адреса памяти в момент первого запроса значения.
Весь ответ на самом деле стоит прочитать.
.В соответствии с документацией Java Platform API вычисление хэшкода основывается на 32-битном внутреннем JVM адресе Объекта.
Правда, объект движется во время выполнения (AFAIK единственная причина - сборщик мусора). Но хэшкод не меняется.
Так что при наличии такого объекта как this
Person person1 = new Person();
person1.setName("Alex");
Person person2 = new Person();
person2.setName("Alex");
Person person3 = person2;
В этом случае person1.hashCode не будет равен person2.hashCode, т.к. адреса памяти этих двух объектов не совпадают.
Но person2. hashCode будет равен man3, потому что они указывают на один и тот же объект.
Так что если вам нужно использовать метод hashCode для ваших объектов, то вы должны реализовать его самостоятельно.
Кстати Реализация String.hashCode различна. Это что-то вроде этого: (синтаксис C#)
public int hashCode(String str)
{
int h = 0;
for (int i = 0; i < str.Length; i++)
h = (h * 31) + str[i];
return h;
}
edit: Здесь не производится проверка на переполнение, так что хэшкод может быть как положительным, так и отрицательным.
.Object.hashCode() использует System.identityHashCode(), который основывается на идентификационном номере для данного объекта.
.Java не генерирует для вас осмысленный hashCode
, ваша задача как программиста - генерировать полезный hashCode
. По умолчанию hashCode
- это просто область памяти.