Почему итерация LinkedHashSet быстрее, чем итерация HashSet в Java?

Вот пример кода:

    Set<Integer> hashSet = new HashSet<>();
    Set<Integer> linkedHashSet = new HashSet<>();

    for(int i = 0; i < 1000; i++){
        hashSet.add(i);
        linkedHashSet.add(i);
    }

    Long startTimeHashSet = System.nanoTime();
    for(Integer i: hashSet){

    }
    Long endTimeHashSet = System.nanoTime();
    System.out.println("HashSet Time:" + (endTimeHashSet - startTimeHashSet));

    Long startTimeLinkedHashSet = System.nanoTime();
    for(Integer i: linkedHashSet){

    }
    Long endTimeLinkedHashSet = System.nanoTime();
    System.out.println("Linked HashSet Time:" + (endTimeLinkedHashSet - startTimeLinkedHashSet));

Результат:

HashSet Time:721774
Linked HashSet Time:132613

Почему это происходит?


person Pritam Banerjee    schedule 08.09.2017    source источник
comment
Ваш бенчмарк страдает от 2 стандартных проблем наивного бенчмаркинга Java. 1) Он не учитывает прогрев JVM. 2) Циклы можно оптимизировать.   -  person Stephen C    schedule 08.09.2017
comment
Я изменил ваш код, чтобы решить проблему прогрева, и реальная разница в производительности минимальна.   -  person Stephen C    schedule 08.09.2017