Несортированный HashSet в Java

Код.

Set<String> set = new HashSet<String>(3);
set.add("3 Lorem");
set.add("1 Lorem");
set.add("2 Lorem");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
    String type = (String) iterator.next();
    System.out.println(type);
}

Выход.

2 Lorem
3 Lorem
1 Lorem

Этот заказ выглядит странно для меня. я добавить 3 Lorem, 1 Lorem, а потом 2 Lorem, Почему они в другом порядке на выходе?

4 ответа

Решение

Из JavaDocs:

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

если вы намеревались поддерживать порядок, лучше используйте TreeSet (но сложность будет log(n)

также проверьте этот пост Hashset vs Treeset

РЕДАКТИРОВАТЬ, как указал @Petar, для поддержания порядка вставки лучше использовать LinkedHashSet

и эта статья Dzone демонстрирует сравнение между всеми тремя с хорошим примером примера и производительности

Хэш-наборы не должны быть отсортированы.

Технически они отсортированы, но по хеш-коду (или его уменьшению); и при столкновении хэшей они могут перетекать в другие сегменты.

Если вы хотите заказать набор, используйте TreeSet вместо. Обычно это немного медленнее, но отсортировано. Если вы хотите сохранить порядок вставки, используйте List такие как ArrayList или же LinkedList,

Там также есть гибрид, называемый LinkedHashSet, что позволяет быстро contains операции, но поддерживает порядок вставки. Обратите внимание, что у него не будет дубликатов.

Использовать LinkedHashSet поддерживать порядок ввода.

Использование TreeSet<String>(); или же TreeSet<String>(String.CASE_INSENSITIVE_ORDER); если вы хотите отсортировать элементы. Используйте List вместо Set, если вам нужно поддерживать порядок вставки.

Другие вопросы по тегам