2016-08-03 2 views
2

У меня вопрос. Он говорит, что HashSet в Java не означают сохранение порядка, но, глядя на мою программуJava hashset and treeset

public static void main(String[] args) { 
    HashSet<Integer> io=new HashSet<Integer>(); 

    Integer io1=new Integer(4); 
    Integer io2=new Integer(5); 
    Integer io3=new Integer(6); 

    io.add(io2); 
    io.add(io3); 
    io.add(io1); 

    System.out.println(io); 
} 

и выполнить его он дает мне упорядоченное множество каждый раз, когда я запустить его. Почему это происходит?

Другой вопрос: если я реализую treeet (как я сделал в предыдущей программе, но вместо hashset using treeet и intead Integer, используя мой класс), мне нужно реализовать compareto?

+0

просто совпадение ... – user1121883

ответ

3

HashSet не поддерживает порядок, но он должен перебирать элементы в некотором порядке при их печати. HashSet подкрепляется HashMap, который выполняет итерации по элементам в порядке расположения ящиков, в которых они хранятся. В вашем простом примере 4,5,6 сопоставляются с ячейками 4,5,6 (так как хэш-код целого числа является значением целого), поэтому они печатаются в порядке возрастания.

Если вы попытались добавить 40,50,60, вы увидите другой заказ ([50, 40, 60]), так как начальное количество бункеров по умолчанию равно 16, поэтому хеш-коды 40,50,60 будут сопоставлены с корзинами 40% 16 (8), 50% 16 (2), 60% 16 (12), так что 50 является первым элементом итерации, а затем 50 и 60.

Что касается TreeSet<SomeCostumClass>, можно либо осуществить Comparable<SomeCostumClass> в SomeCostumClass, или передать конструктору конструкцию Comparator<SomeCostumClass>.

+0

, но любой из них должен быть реализован? – User124235

+0

@ пользователь124235 да – Eran

+0

спасибо за ваш ответ – User124235

3

По состоянию на oracle docs, нет гарантий, что вы будете получать одинаковый заказ все время.

Этот класс реализует интерфейс Set, поддерживаемый хеш-таблицей (фактически экземпляр HashMap). Он не дает никаких гарантий относительно порядка итераций набора; в частности, он не гарантирует, что заказ будет оставаться постоянным с течением времени.

+0

Я не думаю, что это отвечает на вопрос. Вопрос в том, ПОЧЕМУ мы получаем тот же порядок при каждом запуске программы; не гарантирует ли документация «HashSet», что мы это сделаем. –

1

A HashSet хранит внутреннюю хеш-таблицу (https://en.wikipedia.org/wiki/Hash_table), которая приводится в действие результатом соответствующих объектов hashCode(). Для большинства объектов функция hashCode() является детерминированной, поэтому результаты итерации HashSet тех же элементов, вероятно, будут одинаковыми. Это не значит, что он будет заказан. Однако для Integer функция hashCode() функции возвращает само целое число, поэтому для одноуровневой хэш-таблицы оно будет упорядочено.