Почему hashCode объекта по умолчанию возвращает разные значения на разных устройствах? - PullRequest
0 голосов
/ 24 марта 2019

Рассматривая некоторые ответы по всему SO, кажется, что существуют различные мнения о том, что по умолчанию возвращает hashCode() для различных объектов: некоторые говорят, что он работает по тому же алгоритму, другие говорят, что он основан на расположении памяти.

Несмотря на это, я провел несколько тестов, в которых я называю myCustomObject.hashCode() по умолчанию на разных эмуляторах Android, и кажется, что в каждом эмуляторе hashCode всегда одинаков (даже после перезагрузки), но отличается через каждого.

Исходя из этого, я не уверен, действительно ли он основан на алгоритме; или если этот алгоритм содержит некоторую информацию, связанную с тем, где он работает, или даже если он действительно основан на памяти (в этом я так сомневаюсь, поскольку после перезагрузки он будет иметь то же значение).

1 Ответ

2 голосов
/ 24 марта 2019

Все, что вы знаете о Object hashCode - это , что JavaDoc говорит .Эта часть, вероятно, наиболее актуальна:

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

Таким образом, он может быть уникальным, но не гарантированно, и вы не можетеПредположим, что это будет.Это может быть или не быть «некоторой функцией» места в памяти объекта, для любого данного определения «места в памяти», или это может быть какой-то восходящий номер, назначенный объекту при создании и т. Д., И т. Д. Вы не знаетене углубляясь в исходный код используемой вами JDK / JVM (hashCode - это функция native, поэтому src.zip в JDK здесь не поможет), и, кроме того, прагматическая выгода для знания отсутствует.

Я не уверен, действительно ли он основан на алгоритме;или если этот алгоритм содержит некоторую информацию, связанную с тем, где он работает, или даже если он действительно основан на памяти (в этом я так сомневаюсь, так как он будет иметь то же значение после перезагрузки).

Это может бытьИндекс в куче JVM, который с одной и той же программой каждый раз будет находиться в одном и том же месте.

Но опять же: вы не знаете, и прагматическая выгода для знания не существует.

...