Итак, изначально у меня был этот код:
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));
}
}
Для запуска вложенных циклов for на моем компьютере требуется около 4 секунд, и я не понимаю, почему это заняло так много времени. Внешний цикл выполняется 100 000 раз, внутренний цикл for должен выполняться 1 раз (поскольку любое значение hashSet никогда не будет равно -1), а удаление элемента из HashSet равно O (1), поэтому должно быть около 200 000 операций. Если в секунду обычно выполняется 100 000 000 операций, почему мой код запускается за 4 секунды?
Кроме того, если строка hashSet.remove(i);
закомментирована, код занимает всего 16 мс. Если внутренний цикл for закомментирован (но не закомментирован hashSet.remove(i);
), код занимает всего 8 мс.
for val
петля - это то, что отнимает время. Это remove
все еще очень быстро. Какие-то накладные расходы на настройку нового итератора после изменения набора ...?
for val
цикл медленный. Однако обратите внимание, что цикл вообще не нужен. Если вы хотите проверить, есть ли какие-либо значения, отличные от -1 в наборе, было бы гораздо эффективнее проверить hashSet.size() > 1 || !hashSet.contains(-1)
.