for, foreach отличия? [дубликат]

153
23 декабря 2019, 12:30
This question already has an answer here:
Как работает цикл foreach в Java? (1 ответ)
Закрыт 9 месяцев назад.

Почему-то не нашел нормальной информации в интернете и погуглил по темам на стаковерфлоу, но так и не нашел в чем отличие for и for each в Java? Понятно что for синтаксический сахар в Java и всё то, что обычный for может реализовать, можно реализовать и на for each(e), а что еще?

Answer 1

Если вы используете обычные массивы с циклом for-each, то на этапе компиляции он будет преобразован в обычный цикл for с целочисленной счетчиком-переменной. Но если вы используете for-each с коллекциями, то на этапе компиляции он будет преобразован в for с итератором (что-то вроде for(Iterator it = myColl.iterator(); it.hasNext(); )).

Answer 2

Наоборот всё что реализовано на foreach можно реализовать на for. Дело в том, что для foreach у объекта должен быть реализован интерфейс Iterable, как вы например выведете чётные числа от 2 до 16?

for(int i = 2; i<=16; i+=2)
   System.out.println(i);

а вот через foreach надо попариться.

Данный фрагмент:

List<String> list = Arrays.asList("1", "2", "3");
for (String str : list) {
  System.out.println(str);
}

Эквивалентен записи через обычный for таким образом:

List<String> list = Arrays.asList("1", "2", "3");
for(int i = 0; i<list.size(); ++i){
  System.out.println(list.get(i));
}

Ответ @Bakuard не совсем корректен, компилятор переводит foreach в такой байткод:

List<String> list = Arrays.asList("1", "2", "3");
Iterator var4 = list.iterator();
while(var4.hasNext()) {
     String str = (String)var4.next();
     System.out.println(str);
}
Answer 3

Предпочитайте использование for-each циклу for.

Есть книга - Эффективное программирование Java , во 2 издании это 46 статья о преимуществах цикла for-each перед for с различными примерами.

https://vk.com/doc20299052_453037470?hash=65bcfc6f8cc717c341&dl=d313b5ec8243c42f0e

Цикл for-each обладает огромным преимуществом перед for , поскольку в программировании есть некоторые моменты, в которых он довольно таки уместен и прост в использовании, например: вложенная итерация нескольких коллекций, простое выполнение итерации объектов, реализующих Iterable, также, некоторые вещи, написанные с помощью for-each проще понять благодаря визуальной простоты синтаксиса.

Однако, есть три условия , при которых цикл for-each будет бесполезен, это когда будет необходим явный итератор или индекс массива.

Если вам необходимо, могу вкинуть сюда пару примеров с различиями использования.

READ ALSO
Как настроить прогресс бар JProgressBar?

Как настроить прогресс бар JProgressBar?

Как сделать JProgressBar чтобы он работал на кнопку Jbutton и заканчивал работу после того как прогресс дошел до 100%?

196
Как правильно отобразить один item в RecyclerView?

Как правильно отобразить один item в RecyclerView?

Необходимо чтобы не весь список сразу отображался, а по очереди с 0 до listsize(), если пользователь свайпнул

144
Recycler view, Android

Recycler view, Android

У меня есть фрагмент, он хранит список CardView и допинформацию(назову ее "информация A")

121
Вернуть статус ответа на GraphQL

Вернуть статус ответа на GraphQL

Пишу API на GraphQL, с которым работает фронтэнд-приложениеНужно возвращать фронтэндеру что-то вроде status OK и error 404

173