В следующем коде создается вывод [1,2]
, хотя hashset не сортируется.Как этот HashSet производит сортированный вывод?
Set set = new HashSet();
set.add(new Integer(2));
set.add(new Integer(1));
System.out.println(set);
Почему это?
В следующем коде создается вывод [1,2]
, хотя hashset не сортируется.Как этот HashSet производит сортированный вывод?
Set set = new HashSet();
set.add(new Integer(2));
set.add(new Integer(1));
System.out.println(set);
Почему это?
Такое поведение вызвано несколькими отдельными причинами:
HashMap
с и HashSet
ы сохраненные с помощью массиваТак что, если вам добавить несколько маленьких (< 16) целых чисел в HashMap/HashSet, это то, что происходит:
i
имеет Hashcode i
i
i
Обратите внимание, что если начальное число ковшей слишком мал, целые может посадить в ведре не пронумерован после них:
HashSet<Integer> set = new HashSet<>(4);
set.add(5); set.add(3); set.add(1);
for(int i : set) {
System.out.print(i);
}
отпечатков 153
.
HashSet - неупорядоченная коллекция. У него нет никаких гарантий и нет понятий «порядок». См. Этот ответ для получения более подробной информации: What is the difference between Set and List?
Вы можете использовать TreeSet, если вам нужно заказать, отсортированный набор.
Существует также LinkedHashSet для заказанного набора, который не отсортирован.
@superEb Я на самом деле просто добавил этот комментарий к моему ответу. Похоже, мы поняли это одновременно! – Kon
A set
в java не предполагается заказывать. Вместо этого используйте ArrayList
. Также проверьте API Java Collection для дальнейшей справки.
Но не используйте «Список», если элементы должны быть уникальными. – superEb
'LinkedHashSet' обычно является лучшим выбором, если вы хотите быстрый поиск по постоянному времени, но с предсказуемым порядком итерации. Используйте «ArrayList», если вы пытаетесь сэкономить место и можете терпеть медленные (линейные) поисковые запросы. –
@Ashwin Обратите внимание, что вы можете получить время логарифмического времени O (log n) для отсортированного списка с помощью метода 'Collections.binarySearch()'. – Kon
A HashSet
в соответствии с документацией не гарантирует никакой концепции заказа, поэтому то, что вы видите, может очень хорошо измениться в будущем обновлении Java.
Однако, если вы задаетесь вопросом, почему в Java (как сейчас) конкретной реализации HashSet
производит результат, который вы видите: это потому, что Integer
стоимости 1
хэшей в месте во внутренней таблице входа в HashMap
, что приходит до местоположение, на которое 2
хешей (обратите внимание, что HashSet
действительно поддерживается HashMap
с произвольными значениями). Это имеет смысл, поскольку хеш-код объекта Integer
является его значением.
В самом деле, вы можете видеть это, даже если добавить еще больше числа (в пределах определенного диапазона: размер таблицы ввода, который является 16 по умолчанию):
Set<Integer> set = new HashSet<>();
set.add(2);
set.add(1);
set.add(4);
set.add(3);
set.add(0);
System.out.println(set);
[0, 1, 2, 3, 4]
Итерация больше HashSet
происходит путем повторения таблицы внутреннего входа, что означает, что элементы, ранее представленные в таблице, первыми.
Используйте несколько тестовых примеров. Включите 20 номеров и посмотрите, одинаковый ли результат. – JNL