Então, originalmente, eu tinha esse código:
import java.util.*;
public class sandbox {
public static void main(String[] args) {
HashSet<Integer> hashSet = new HashSet<>();
for (int i = 0; i < 100_000; i++) {
hashSet.add(i);
}
long start = System.currentTimeMillis();
for (int i = 0; i < 100_000; i++) {
for (Integer val : hashSet) {
if (val != -1) break;
}
hashSet.remove(i);
}
System.out.println("time: " + (System.currentTimeMillis() - start));
}
}
Demora cerca de 4s para executar os loops aninhados no meu computador e não entendo por que demorou tanto. O loop externo executa 100.000 vezes, o loop for interno deve executar 1 vez (porque qualquer valor de hashSet nunca será -1) e a remoção de um item de um HashSet é O (1), portanto, deve haver cerca de 200.000 operações. Se normalmente existem 100.000.000 de operações em um segundo, como meu código leva 4s para ser executado?
Além disso, se a linha hashSet.remove(i);
for comentada, o código leva apenas 16ms. Se o loop for interno for comentado (mas não hashSet.remove(i);
), o código leva apenas 8ms.
for val
loop está ocupando o tempo. O remove
ainda é muito rápido. Algum tipo de sobrecarga que configura um novo iterador após a modificação do conjunto ...?
for val
loop é lento. No entanto, observe que o loop não é necessário. Se você deseja verificar se existem valores diferentes de -1 no conjunto, seria muito mais eficiente verificar hashSet.size() > 1 || !hashSet.contains(-1)
.