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