Я пытаюсь понять внутреннюю реализацию java.util.HashMap
и java.util.HashSet
.
Ниже перечислены сомнения, возникающие у меня в голове:
- Какова важность
@Override public int hashcode()
в HashMap/HashSet? Где этот хэш-код используется внутри? - Я обычно видел ключ HashMap как
String
какmyMap<String,Object>
. Можно ли сопоставить значения сsomeObject
(вместо String), напримерmyMap<someObject, Object>
? Какие все контракты мне нужно, чтобы повиноваться, чтобы это произошло успешно?
Спасибо заранее!
EDIT:
- Мы говорим, что хэш-код ключа (check!) - это фактическая вещь, против которой значение отображается в хеш-таблице? И когда мы делаем
myMap.get(someKey);
, java внутренне вызываетsomeKey.hashCode()
, чтобы получить номер в таблице Hash для поиска результирующего значения?
Ответ: Да.
ИЗМЕНИТЬ 2:
- В
java.util.HashSet
, откуда находится ключ, созданный для таблицы Hash? Это из объекта, который мы добавляем, например.mySet.add(myObject);
, тогдаmyObject.hashCode()
собирается решить, где это помещается в хэш-таблицу? (поскольку мы не предоставляем ключи в HashSet).
Ответ: Добавленный объект становится ключом. Значение является фиктивным!