Несортированный 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
операции, но поддерживает порядок вставки. Обратите внимание, что у него не будет дубликатов.
Использование TreeSet<String>();
или же TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
если вы хотите отсортировать элементы. Используйте List вместо Set, если вам нужно поддерживать порядок вставки.