Какова реализация `hashCode` по умолчанию?

Если не переопределить метод hashCode, какова реализация по умолчанию hashCode?

Ответ 1

Затем этот класс наследует hashCode от одного из своих предков. Если их не переопределяет, используется Object.hashCode.

Из docs:

Насколько разумно практично, метод hashCode, определенный классом Object, возвращает разные целые числа для разных объектов. (Обычно это выполняется путем преобразования внутреннего адреса объекта в целое число, но этот способ реализации не требуется языком программирования JavaTM.)

Таким образом, реализация по умолчанию - это JVM-specific

Ответ 2

По умолчанию методы, которые не переопределены, наследуются от Object.

Если вы посмотрите на документацию этого метода, возвращаемые значения будут "[...] distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer [...])". Метод в java.lang.Object объявляется как native, что означает, что реализация обеспечивается JVM и может варьироваться в зависимости от среды выполнения.

Небольшой пример:

Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1.hashCode());
System.out.println(o2.hashCode());

печатает (используя мой jdk6):

1660187542
516992923

Hex-представление значения hashCode() используется в реализации по умолчанию toString() по умолчанию: Running System.out.println(o1) печатает что-то вроде

[email protected]

Ответ 3

Object.hashcode() является нативным методом.

public native int hashCode();

Это означает, что он реализован в конкретном коде платформы и отображается как собственный метод.

код для него будет скомпилированным кодом и недоступен с JDK

этот существующий вопрос может предоставить дополнительную информацию.