2015-06-05 4 views
1

Мне интересно, как определяется место элемента в HashSet. Это через какую-то встроенную функцию хеширования?Почему элементы в HashSet в случайном порядке?

Set <String>set=new HashSet<String>(); 
    set.add("January"); 
    set.add("February"); 
    set.add("July"); 
    set.add("August"); 
    set.add("September"); 
    set.add("October"); 
    set.add("Novermber"); 
    set.add("December"); 
    set.add("March"); 
    set.add("April"); 
    set.add("May"); 
    set.add("June"); 


    Iterator <String>it=set.iterator(); 
    while(it.hasNext()){ 
     System.out.println(it.next()); 
    } 

Я получаю этот результат

June 
October 
December 
September 
May 
March 
Novermber 
July 
January 
February 
April 
August 

Что такое объяснение для этого заказа или выход?

+2

Есть разница между тем, что они не соответствуют порядку вставки и говорят, что они расположены случайным образом. [Как говорят документы] (https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html): «* Он не дает никаких гарантий относительно порядка итерации набора * , –

+0

BTW, относительно вашего вопроса о повторном хешировании: это не дубликат, и это совершенно законный вопрос. Но есть много хэш-карт, и они ведут себя по-разному. – biziclop

ответ

6

HashSet основан на массиве. Индекс предметов в массиве рассчитывается на основе функции hashCode().

Итератор в HashSet перемещается по элементам массива, пропуская нулевые элементы. Вот почему ваш заказ «странный». Если вам нужно сохранить порядок вставки, используйте LinkedHashSet.

1

Вы должны заплатить за заказ (в большинстве случаев в виде вычислительного времени). И documentation явно указывает, что [...]. Он не дает никаких гарантий относительно итерационного порядка набора; в частности, он не гарантирует, что порядок будет оставаться постоянным с течением времени. Поэтому я считаю, что порядок не учитывается ради производительности.

Смежные вопросы