HashMap
сохраняет ключи на карте, сначала преобразуя ключ в целое число, называемое значением ha sh. Это делается путем вызова метода hashCode()
объекта. Затем поиск bin в таблице ha sh в зависимости от этого значения ha sh.
Если вы используете Oracle или OpenJDK, скорее всего, hashCode()
of integer вернет само int (потому что значение ha sh также является просто int
):
/**
* Returns a hash code for a {@code int} value; compatible with
* {@code Integer.hashCode()}.
*
* @param value the value to hash
* @since 1.8
*
* @return a hash code value for a {@code int} value.
*/
public static int hashCode(int value) {
return value;
}
Реализация HashMap по умолчанию сильно зависит от java -версии. Принцип (наивная реализация) состоит в том, чтобы взять модуль значения ha sh и длину таблицы, чтобы получить индекс:
index = hash % table.length; // Don't try this, it breaks for negative hash values.
Java 11 реализация, похоже, делает некоторый массив из- обман деревьев, где он ходит по столу, чтобы найти ха sh.
По крайней мере, я мог бы воспроизвести ваш пример с Java 11, и я мог бы сломать ваш пример, изменив эту строку:
Map<Integer, List<String>> lengthToWordsMap = new HashMap<>(4);
Обратите внимание, что даже метод Integer.hashCode()
не указывает , как он вычисляет значение ha sh, поэтому тот факт, что он вычисляет его с помощью функции идентичности, равен недокументированный и поэтому никогда не следует полагаться на него.
Ответ на ваш вопрос таков: это происходит потому, что благоприятные условия сговариваются (и уточняют c детали реализации), а не из-за определенных logi c.