Как уже упоминалось выше в ответе @Serge Harnyk
HashMap не гарантирует порядок вставки (или любой другой) элементов.
Я запустилПриведенный выше код, которым вы поделились в вопросе с массивом [66,66,69,69,66,63,63,69]
, и вывод был
Key= 66 Value= 3
Key= 69 Value= 3
Key= 63 Value= 2
Здесь вы можете видеть, что вывод не в отсортированном порядке. Другой массив, для которого entrySet () не возвращал элементы в отсортированном порядке, был [10,5,5,10,10,5,10000000]
Key= 5 Value= 3
Key= 10000000 Value= 1
Key= 10 Value= 3
Итак, как указано в документации HashMapпорядок элементов, возвращаемых entrySet () или keySet () HashMap, не гарантируется в порядке вставки / сортировки.
Хеш-индекс , относительно которого должен быть хеширован ключ, определяется на основе хеш-кода этого конкретного ключа, сгенерированного функцией hashCode (), реализованной в HashMap. Вы можете найти хеш-код ключа, используя функцию .hashCode ()
for(Map.Entry<Integer,Integer> entry : hm.entrySet()) {
System.out.println("key= "+entry.getKey()+" has Hash Code= "+entry.getKey().hashCode());
}
Array [66,66,69,69,66,63,63,69] имел вывод
key= 66 has Hash Code= 66
key= 69 has Hash Code= 69
key= 63 has Hash Code= 63
Массив [10,5,5,10,10,5,10000000] имел вывод
key= 5 has Hash Code= 5
key= 10000000 has Hash Code= 10000000
key= 10 has Hash Code= 10
Из них видно, что для целочисленных ключей хеш-код не равен hashIndex = key % noOfBuckets
. Кроме того, вы можете определить собственную реализацию метода hashCode () и использовать его против HashMap. Вы можете найти подробное объяснение реализации вашей пользовательской функции hashCode () здесь.
см. https://www.geeksforgeeks.org/internal-working-of-hashmap-java/