как делает хэш-код () метод работ Java?

Мне любопытно, как Java генерирует значения хэш-функции при помощи хэш-кода () метод Объектного API?

17
задан Luke Francl 24 December 2009 в 22:39
поделиться

5 ответов

Java не генерирует hashCode(), т.е. здесь ничего автоматического не происходит. Однако, Object генерирует HashCode по адресу памяти экземпляра объекта. Большинство классов (особенно если вы собираетесь использовать его в любом из API Collection) должны реализовать свой собственный HashCode (и по договору свой собственный метод equals).

.
10
ответ дан 30 November 2019 в 10:58
поделиться

hashCode() из Object на самом деле является родным методом, а реализация на самом деле не является чистой Java. Теперь, что касается того, как он работает, ответ Тома Хоутина отлично его объясняет:

Многие будут утверждать, что Object.hashCode вернёт адрес объектного представления в памяти. В современных реализациях объекты фактически перемещаются в памяти. Вместо этого используется область заголовка объекта для хранения значения, которое может быть лениво выведено из адреса памяти в момент первого запроса значения.

Весь ответ на самом деле стоит прочитать.

.
24
ответ дан 30 November 2019 в 10:58
поделиться

В соответствии с документацией 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: Здесь не производится проверка на переполнение, так что хэшкод может быть как положительным, так и отрицательным.

.
5
ответ дан 30 November 2019 в 10:58
поделиться

Object.hashCode() использует System.identityHashCode(), который основывается на идентификационном номере для данного объекта.

.
4
ответ дан 30 November 2019 в 10:58
поделиться

Java не генерирует для вас осмысленный hashCode, ваша задача как программиста - генерировать полезный hashCode. По умолчанию hashCode - это просто область памяти.

.
1
ответ дан 30 November 2019 в 10:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: