2016-03-10 3 views
1

Я пытаюсь изучить концепцию интерфейса Set и класса HashSet в java. Я прочиталИтерирование через экземпляр класса HashSet, ожидание случайного порядка, но результаты всегда одного порядка

при использовании класса HashSet, что нет гарантии последовательности элементов, когда я перебираю.

Я пришел с некоторым кодом и пробежал десять раз, и он всегда повторяется в порядке вставки. Так это из-за удачи?

Set<Integer> set1 = new HashSet<>(); 
set1.add(1); 
set1.add(2); 
set1.add(3); 
set1.add(2); 

Iterator i1 = set1.iterator(); 
while (i1.hasNext()){ 
    System.out.println(i1.next()); 
} 
+1

Да, это просто совпадение, 'HashSet' является неупорядоченным и несортированным. если вы хотите, чтобы порядок элементов поддерживался, вы можете использовать 'LinkedHashSet' – Ramanlfc

+1

. Реализация hashcode Integer использует это число (также может). поэтому, если записи хранятся по hashcode, вы увидите цифры в порядке. –

ответ

1

ДА. Это из-за «удачи». Это зависит от реализации JRE! Я узнал об этом трудный путь много лет назад, когда начал внедряться в Java, и код был протестирован на различных платформах.

Если я помню, в окнах HashSet Итерация была идеально упорядочена, но в Mac OSX полностью скремблировали!

Итог: Всегда полагайтесь на документы, а не на очевидные результаты!

1

В соответствии с Javadoc:

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

От Java4 мы имеем LinkedHashSet, который гарантирует, что порядок итерации и порядок вставки такой же.