Я узнаю о контейнерах в Java и недавно прочитал, что HashSet не дает элементов в порядке. Что интересно для Целое число отсортировано случайно отсортировано по HashSet. Когда я сменил его тип на Двойной печатный HashSet больше не сортировался. Мой вопрос: работает ли HashSet по-разному для разных типов?Почему HashSet сортируется?
ответ
HashSet
использует HashMap
внутренне. HashMap
сохраняет свои элементы в хеш-таблице, используя каждый метод Object hashCode()
.
Для int
и double
, это auto-boxed в Integer
и Double
классов. Когда вы делаете HashSet
из int
, он использует метод Integer's hashCode(), который возвращает int
. Поэтому, если вы добавите int
, они будут отсортированы. Но для метода double
, Double's hashCode() метод намного сложнее, поскольку в памяти представлены двойники.
Это справедливо только для некоторых небольших диапазонов целочисленных значений , – Holger
При хешировании double Java преобразует его в длинный, поскольку оба они являются просто 64-битными значениями в памяти.
На самом деле вы можете экспериментировать с хэш-кодом, чтобы увидеть, как он работает для целого и двойного.
Проверить это для более подробной информации: Hash a double in Java
Это зависит от хэш-кодов. – SLaks
Не полагайтесь на порядок хешета. Все, что вы находите, является чисто случайным, поскольку любая функция кода и хэширования реализуется под капотом. – CollinD
@CollinD Я просто сделал цикл for и положил 10 000 элементов в HashSet, используя random.nextInt(); – soommy12