Skip to content

Commit 669451f

Browse files
comavpenhorse
authored andcommitted
Add correct description of default Object#hashCode() method
Closes enhorse#118
1 parent b640360 commit 669451f

2 files changed

Lines changed: 5 additions & 3 deletions

File tree

core.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,12 +1241,14 @@ public boolean equals(Object obj) {
12411241
}
12421242
```
12431243

1244-
Реализация метода `Object.hashCode()` описана как `native`, т.е. определенной не с помощью Java кода и обычно возвращает адрес объекта в памяти:
1244+
Реализация метода `Object.hashCode()` описана как `native`, т.е. определенной не с помощью Java кода и в общем случае зависит от реализации JVM:
12451245

12461246
```java
12471247
public native int hashCode();
12481248
```
12491249

1250+
В HotSpot JVM хэш код по умолчанию вычисляется с помощью алгоритма генерации простых чисел - Xorshift.
1251+
12501252
[к оглавлению](#java-core)
12511253

12521254
## Для чего нужен метод `hashCode()`?
@@ -1288,7 +1290,7 @@ public native int hashCode();
12881290
[к оглавлению](#java-core)
12891291

12901292
## Можно ли так реализовать метод `equals(Object that) {return this.hashCode() == that.hashCode()}`?
1291-
Строго говоря нельзя, поскольку метод `hashCode()` не гарантирует уникальность значения для каждого объекта. Однако для сравнения экземпляров класса `Object` такой код допустим, т.к. метод `hashCode()` в классе `Object` возвращает уникальные значения для разных объектов (его вычисление основано на использовании адреса объекта в памяти).
1293+
Строго говоря нельзя, поскольку метод `hashCode()` не гарантирует уникальность значения для каждого объекта. Однако для сравнения экземпляров класса `Object` такой код допустим, т.к. метод `hashCode()` в классе `Object` возвращает уникальные значения для разных объектов (его вычисление основано на использовании алгоритма генерации случайных чисел).
12921294

12931295
[к оглавлению](#java-core)
12941296

jcf.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,7 @@ public class Q {
810810
[к оглавлению](#java-collections-framework)
811811

812812
## Почему нельзя использовать `byte[]` в качестве ключа в `HashMap`?
813-
Хэш-код массива не зависит от хранимых в нем элементов, а присваивается при создании массива (метод вычисления хэш-кода массива не переопределен и вычисляется по стандартному `Object.hashCode()` на основании адреса массива). Так же у массивов не переопределен `equals` и выполняется сравнение указателей. Это приводит к тому, что обратиться к сохраненному с ключом-массивом элементу не получится при использовании другого массива такого же размера и с такими же элементами, доступ можно осуществить лишь в одном случае — при использовании той же самой ссылки на массив, что использовалась для сохранения элемента.
813+
Хэш-код массива не зависит от хранимых в нем элементов, а присваивается при создании массива (метод вычисления хэш-кода массива не переопределен и вычисляется по стандартному `Object.hashCode()` на основе алгоритма генерации простых чисел). Так же у массивов не переопределен `equals` и выполняется сравнение указателей. Это приводит к тому, что обратиться к сохраненному с ключом-массивом элементу не получится при использовании другого массива такого же размера и с такими же элементами, доступ можно осуществить лишь в одном случае — при использовании той же самой ссылки на массив, что использовалась для сохранения элемента.
814814

815815
[к оглавлению](#java-collections-framework)
816816

0 commit comments

Comments
 (0)