2013-07-01 3 views
0
import java.util.Iterator; 
    import java.util.*; 
    public class HashSetDemo 
    { 
    public static void main(String[] args) 
    { 
    HashSet<Integer> intSet = new HashSet<Integer>(); 
    intSet.add(2); 
    intSet.add(7); 
    intSet.add(7); 
    intSet.add(3); 
    intSet.add(4); 
    intSet.add(9); 
    intSet.add(1); 
    intSet.add(13); 
    System.out.println(intSet); 
    intSet.remove(1); 
    System.out.println(intSet); 

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

+0

Ведра! Хеш-ковши !!! – Thihara

+0

Возможный дубликат [Порядок значений, полученных с помощью HashMap] (http://stackoverflow.com/questions/2144776/order-of-values-retrieved-from-a-hashmap) –

+0

У вас есть «случайное взаимодействие», между 1) способ работы хэш-таблиц, 2) реализация метода Integer.hashcode(), 3) начального размера HashMap по умолчанию и 4) выбора ключей. См. Связанный вопрос/ответ для более подробного объяснения. –

ответ

1

HashSet не дает никаких гарантий относительно порядка итераций набора; в частности, он не гарантирует, что порядок будет оставаться постоянным с течением времени

от HashSet JavaDoc.

1

Обратите внимание: HashSet никогда не вернет ваши значения в каком-либо конкретном порядке.

Для достижения упорядоченной итерации вы должны использовать TreeSet (или какой-либо другой вид SortedSet).

0

Потому что набор концептуально не имеет порядка. если набор явно является списком, деревом и т. д., тогда существует определенный порядок. Если вы видите конкретный заказ из приведенного выше кода, он специфичен для реализации и значений.

1

Hashset не гарантирует порядок элементов. Но он вычисляет hashcode для объектов в нем. Возможно, у вас это есть, поскольку целые числа могут указывать последовательный хэш-код (до достижения максимальной емкости)

Hashset имеет массив ведер. В соответствии с исходным кодом начальной емкости составляет 16:

static final int DEFAULT_INITIAL_CAPACITY = 16; 

Итак, когда вы попробовать свои небольшие целые числа, они были устроены в порядке

+0

Я думаю, что это может быть возможным ответом. –

+0

Это так. См. Связанный вопрос. –

0

Согласно документации HashSet:

Это не дает никаких гарантий, как к порядку итерации множества; в частности, он не гарантирует, что порядок будет оставаться постоянным с течением времени.

И это тоже не гарантирует, что порядок итераций всегда будет не постоянным. Вы можете получить итерационный заказ. FYI в моей системе порядок итераций меняется при каждом выполнении.

1

Это не гарантируется. Установите эти значения и проверьте.

intSet.add(21); 
    intSet.add(22); 
    intSet.add(7); 
    intSet.add(3); 
    intSet.add(4); 
    intSet.add(9); 
    intSet.add(1); 
    intSet.add(13); 
0

По мере добавления и удаления элементов с течением времени порядок итераций может измениться. Вы никогда не должны полагаться на итерационный порядок Hashset, так как он «не дает никаких гарантий относительно порядка итерации», хотя на практике, если вы создаете новый Hashset с конструктором по умолчанию и добавляете те же элементы, вы оказываетесь в одной и той же итерации заказ.

0

Согласно Документу API Java от Hashset.

Комплект не получает порядок элементов.

Поскольку вы ввели элементы в HashSet, и он может возвращаться в любом порядке, может быть, потому что он принимает разные порядки каждый раз или нет.

Поведение Set, особенно Hashset, зависит от Hashcode для каждого объекта, который вы добавили в набор.

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

+0

Когда я учился, я попытался добавить много значений, и я получил доказательство того, что Set не поддерживает порядок, а в Hashset потребовалось много времени из-за Hashcodes. Я не могу сказать, что вы просто верите мне, но просто продолжайте и попробуйте, это может сработать. Но это требует времени. – artapart

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