Использование «для» в Java - PullRequest
24 голосов
/ 07 августа 2009

Я довольно новичок в Java, и в другом вопросе переполнения стека о для циклов в ответе сказано, что в Java было два варианта использования:

for (int i = 0; i < N; i++) {
}


for (String a : anyIterable) {
}

Я знаю первое использование for и много использовал его, но я никогда не видел второго. Что он делал, и когда я буду его использовать?

Ответы [ 5 ]

37 голосов
/ 07 августа 2009

Первым из двух указанных вами является классический цикл C for. Это дает программисту контроль над критериями итерации и позволяет выполнять три операции: инициализация; тест петли; выражение приращения. Хотя он часто используется для последовательного повторения для заданного количества попыток, как в вашем примере:

for (int i=0; i < N : i++)

В коде есть еще много случаев, когда for использовался для перебора коллекций:

for (Iterator iter = myList.iterator(); iter.hasNext();)

Чтобы облегчить компоновку второго типа (где третье предложение часто не использовалось) и дополнить Generics , представленный в Java 1.5, второй из двух ваших примеров - расширенный цикл for for-each loop - был введен.

Второй используется с массивами и общими коллекциями. См. Эту документацию . Он позволяет перебирать универсальную коллекцию, в которой вы знаете тип Collection, без необходимости приведения результата Iterator.next() к известному типу.

Сравните:

for(Iterator iter = myList.iterator; iter.hasNext() ; ) {
   String myStr = (String) iter.next();
   //...do something with myStr
}

с

for (String myStr : myList) {
   //...do something with myStr
 }

Этот «новый стиль» для цикла можно использовать и с массивами:

String[] strArray= ...
for (String myStr : strArray) {
   //...do something with myStr
}
4 голосов
/ 07 августа 2009

Цикл for в основном приятен на глаз, что облегчает чтение кода. (Если вы произносите: как "в").

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

Я все еще использую регулярный цикл for, когда имею дело в основном с математическим кодом или когда мне нужно «i», чтобы увидеть, сколько раз я зациклился.

1 голос
/ 07 августа 2009

Он называется для каждого цикла и, по сути, может использоваться с любым, что реализует

java.lang.Iterable

Универсальные коллекции реализуют этот интерфейс, но вы можете создать свой собственный класс, который сделал бы то же самое. Это делает работу со всем в списке / коллекции очень простой, хотя недостатком является то, что вы не получаете явного доступа к текущему номеру в списке, как в традиционном цикле. Из-за обращений к классам итераторов с этим типом цикла по сравнению с традиционными циклами связаны некоторые дополнительные издержки.

1 голос
/ 07 августа 2009

Используется для перебора всего массива или коллекции Iterable. Это в основном заменяет:

for(int i=0; i<N.length; i++)

И может быть использован с Generics, что довольно круто

0 голосов
/ 01 июля 2017

Оба они одинаковы по функциональности, но for (String a: anyIterable) {} , более читабелен, менее типизирован и короче. для (int i = 0; i индексировать коллекцию с помощью переменной управления циклом i и для (String a: anyIterable) {} не индексирует коллекцию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...