Skip to content

Commit d4e407b

Browse files
authored
Add answer to the question about role of Comparable in HashMap (enhorse#156)
* Add answer to the question about role of Comparable in HashMap after Java 8
1 parent 669451f commit d4e407b

2 files changed

Lines changed: 16 additions & 0 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@
228228
+ [Каково максимальное число значений `hashCode()`?](jcf.md#Каково-максимальное-число-значений-hashcode)
229229
+ [Какое худшее время работы метода get(key) для ключа, которого нет в `HashMap`?](jcf.md#Какое-худшее-время-работы-метода-getkey-для-ключа-которого-нет-в-hashmap)
230230
+ [Какое худшее время работы метода get(key) для ключа, который есть в `HashMap`?](jcf.md#Какое-худшее-время-работы-метода-getkey-для-ключа-который-есть-в-hashmap)
231+
+ [Почему несмотря на то, что ключ в `HashMap` не обязан реализовывать интерфейс `Comparable`, двусвязный список всегда удается преобразовать в красно-черное-дерево?](jcf.md#Почему-несмотря-на-то-что-ключ-в-HashMap-не-обязан-реализовывать-интерфейс-Comparable-двусвязный-список-всегда-удается-преобразовать-в-красно-черное-дерево)
231232
+ [Сколько переходов происходит в момент вызова `HashMap.get(key)` по ключу, который есть в таблице?](jcf.md#Сколько-переходов-происходит-в-момент-вызова-hashmapgetkey-по-ключу-который-есть-в-таблице)
232233
+ [Сколько создается новых объектов, когда вы добавляете новый элемент в `HashMap`?](jcf.md#Сколько-создается-новых-объектов-когда-вы-добавляете-новый-элемент-в-hashmap)
233234
+ [Как и когда происходит увеличение количества корзин в `HashMap`?](jcf.md#Как-и-когда-происходит-увеличение-количества-корзин-в-hashmap)

jcf.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
+ [Каково максимальное число значений `hashCode()`?](#Каково-максимальное-число-значений-hashcode)
6464
+ [Какое худшее время работы метода get(key) для ключа, которого нет в `HashMap`?](#Какое-худшее-время-работы-метода-getkey-для-ключа-которого-нет-в-hashmap)
6565
+ [Какое худшее время работы метода get(key) для ключа, который есть в `HashMap`?](#Какое-худшее-время-работы-метода-getkey-для-ключа-который-есть-в-hashmap)
66+
+ [Почему несмотря на то, что ключ в `HashMap` не обязан реализовывать интерфейс `Comparable`, двусвязный список всегда удается преобразовать в красно-черное-дерево?](#Почему-несмотря-на-то-что-ключ-в-HashMap-не-обязан-реализовывать-интерфейс-Comparable-двусвязный-список-всегда-удается-преобразовать-в-красно-черное-дерево)
6667
+ [Сколько переходов происходит в момент вызова `HashMap.get(key)` по ключу, который есть в таблице?](#Сколько-переходов-происходит-в-момент-вызова-hashmapgetkey-по-ключу-который-есть-в-таблице)
6768
+ [Сколько создается новых объектов, когда вы добавляете новый элемент в `HashMap`?](#Сколько-создается-новых-объектов-когда-вы-добавляете-новый-элемент-в-hashmap)
6869
+ [Как и когда происходит увеличение количества корзин в `HashMap`?](#Как-и-когда-происходит-увеличение-количества-корзин-в-hashmap)
@@ -832,6 +833,20 @@ ___O(N)___. Худший случай - это поиск ключа в `HashMap
832833

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

836+
## Почему несмотря на то, что ключ в `HashMap` не обязан реализовывать интерфейс `Comparable`, двусвязный список всегда удается преобразовать в красно-черное дерево?
837+
Красно-черное дерево - это самобалансирующееся бинарное дерево поиска. Это означает, что для его построения нужно уметь сравнивать элементы между собой.
838+
839+
В Java обычно сравнение объектов происходит с помощью метода `compareTo()`, который определен в интерфейсе `Comparable`. На первый взгляд кажется логичным, если бы после Java 8 у ключа в `HashMap` появилось дополнительное требование - реализовывать `Comparable`.
840+
841+
Чтобы избежать этого, используется следующий алгоритм при сравнении ключей:
842+
1. Сначала делается попытка сравнить хэши ключей
843+
2. Если хэши равны и оба ключа реализуют `Comparable`, то для сравнения вызывается метод `compareTo()`
844+
3. Если ключи не реализуют `Comparable`, то сравнение происходит с помощью метода `tieBreakOrder()`, в котором
845+
+ сначала будет совершена попытка сравнить ключи через названия их классов (`getClass().getName()`)
846+
+ если ключи являются экземплярами одного класса, то сравниваться будут результаты метода `System.identityHashCode()`
847+
848+
[к оглавлению](#java-collections-framework)
849+
835850
## Сколько переходов происходит в момент вызова `HashMap.get(key)` по ключу, который есть в таблице?
836851
+ ключ равен `null`: __1__ - выполняется единственный метод `getForNullKey()`.
837852
+ любой ключ отличный от `null`: __4__ - вычисление хэш-кода ключа; определение номера корзины; поиск значения; возврат значения.

0 commit comments

Comments
 (0)