2016-11-29 2 views
2

Я узнаю о контейнерах в Java и недавно прочитал, что HashSet не дает элементов в порядке. Что интересно для Целое число отсортировано случайно отсортировано по HashSet. Когда я сменил его тип на Двойной печатный HashSet больше не сортировался. Мой вопрос: работает ли HashSet по-разному для разных типов?Почему HashSet сортируется?

+1

Это зависит от хэш-кодов. – SLaks

+0

Не полагайтесь на порядок хешета. Все, что вы находите, является чисто случайным, поскольку любая функция кода и хэширования реализуется под капотом. – CollinD

+0

@CollinD Я просто сделал цикл for и положил 10 000 элементов в HashSet, используя random.nextInt(); – soommy12

ответ

2

HashSet использует HashMap внутренне. HashMap сохраняет свои элементы в хеш-таблице, используя каждый метод Object hashCode().

Для int и double, это auto-boxed в Integer и Double классов. Когда вы делаете HashSet из int, он использует метод Integer's hashCode(), который возвращает int. Поэтому, если вы добавите int, они будут отсортированы. Но для метода double, Double's hashCode() метод намного сложнее, поскольку в памяти представлены двойники.

+0

Это справедливо только для некоторых небольших диапазонов целочисленных значений , – Holger

1

При хешировании double Java преобразует его в длинный, поскольку оба они являются просто 64-битными значениями в памяти.

На самом деле вы можете экспериментировать с хэш-кодом, чтобы увидеть, как он работает для целого и двойного.

Проверить это для более подробной информации: Hash a double in Java