Какие циклы бывают в Java?
Что проверяют
Базовый синтаксис и умение выбрать конструкцию под задачу. Для тестировщика вопрос ещё и про автотесты: циклы там появляются при обходе коллекций и при ожидании состояния. Уточняющий вопрос обычно про разницу while и do-while или про то, как удалить элемент прямо во время обхода.
Как отвечать
for: инициализация, условие, шаг. Берут, когда нужен индекс или известно число повторений. Записьfor (;;)даёт бесконечный цикл;while: условие проверяется до тела, число итераций заранее неизвестно;do-while: тело выполняется хотя бы раз, условие проверяется после. Встречается редко, но спрашивают именно про это отличие;for-each, он же расширенныйfor:for (String s : list)работает по массивам и по любомуIterable, внутри разворачивается вIterator. Индекса нет, заменить элемент через переменную цикла нельзя;- управляющие конструкции:
breakвыходит из цикла,continueпропускает итерацию, метка перед циклом позволяет выйти сразу из вложенного.
Отдельно проговорите, что list.forEach(...) и stream().forEach(...) это не цикл, а обход: прервать его break нельзя, вместо этого есть findFirst, anyMatch и takeWhile, а стек вызовов при отладке читается тяжелее. Удаление во время обхода делается через iterator.remove() или list.removeIf(...), иначе прилетит ConcurrentModificationException. Для контекста QA уместно добавить: ожидание в автотестах пишется не циклом со Thread.sleep, а явным ожиданием (WebDriverWait, Awaitility), иначе тест становится нестабильным и медленным одновременно.
Где спотыкаются
Путают while и do-while и не могут сказать, сколько раз выполнится тело при ложном условии. Правильный ответ: ноль раз и один раз соответственно.
Удаляют элемент из списка внутри for-each и получают исключение на следующей итерации. Причина в счётчике модификаций у итератора, а не в многопоточности, как думают по названию.
Пишут ожидание элемента циклом со sleep на фиксированные секунды. Тест либо падает на медленном стенде, либо всегда тратит лишнее время.