Почему в Java есть два вида циклов for? - PullRequest
24 голосов
/ 02 мая 2011

У меня есть цикл for, и я не уверен, как он работает. Я знаком с:

for(int i = 0; i <= 9; i++)
{
    /* implementation */
}

Я запутался в цикле for в следующей форме:

String[] myString = new String[] {"one", "two", "three", "some other stuff"};

String str1 = "", str2 = "";  

for (String s :  myString)
{
    /* implementation */
}

Как работают эти типы for циклов? чем они отличаются от обычных for петель?

Ответы [ 8 ]

35 голосов
/ 02 мая 2011

Первый оригинал для цикла. Вы инициализируете переменную, устанавливаете условие завершения и предоставляете счетчик увеличения / уменьшения состояния (есть исключения, но это классический вариант)

Для этого

for (int i=0;i<myString.length;i++) { 
  System.out.println(myString[i]); 
}

правильно.

Для Java 5 была предложена альтернатива. Любая вещь, которая реализует повторяемость, может быть поддержана. Это особенно приятно в коллекциях. Например, вы можете повторить список следующим образом:

List<String> list = ....load up with stuff

for (String string : list) {
  System.out.println(string);
}

вместо

for (int i=0; i<list.size();i++) {
  System.out.println(list.get(i));
}

Так что это действительно альтернативная запись. Любой элемент, который реализует Iterable (то есть может возвращать итератор), может быть записан таким образом.

То, что происходит за кулисами, примерно так: (более эффективно, но я пишу это явно)

Iterator<String> it = list.iterator();
while (it.hasNext()) {
  String string=it.next();
  System.out.println(string);
}

В конце концов, это просто синтаксический сахар, но довольно удобный.

4 голосов
/ 02 мая 2011

В статье приведено отличное описание этой функции Петля For-Each .На примере показано, как использование стиля for-each может создать более четкий код, который легче читать и писать.

2 голосов
/ 02 мая 2011

Используя первый for -loop, вы вручную перечисляете массив, увеличивая индекс до длины массива, а затем вручную получая значение текущего индекса.

Последний синтаксис добавляется вJava 5 и перечисляет массив, используя экземпляр Iterator под капотами.Тогда у вас есть доступ только к объекту (не к индексу), и вы не сможете настроить массив при перечислении.

Это удобно, когда вы просто хотите выполнить некоторые действия со всеми объектами в массиве.

2 голосов
/ 02 мая 2011

Цикл for-each был введен в Java 1.5 и используется с коллекциями (и педантичными, массивами и всем, что реализует интерфейс Iterable<E> ..., который отмечается в статье):

http://download.oracle.com/javase/1,5.0/docs/guide/language/foreach.html

1 голос
/ 02 мая 2011

Что-то, чего не касается ни один из других ответов, - это то, что ваш первый цикл индексирует список.В то время как цикл for-each использует Iterator.Некоторые списки, такие как LinkedList, будут повторяться быстрее с Iterator против get(i).Это потому, что итератор списка ссылок отслеживает текущий указатель.Принимая во внимание, что каждый get в вашем для i = 0 до 9 должен пересчитать смещение в связанный список.В общем, лучше использовать for-each или Iterator, поскольку он будет использовать итератор Collection, который теоретически оптимизирован для типа коллекции.

1 голос
/ 02 мая 2011

Цикл For-each, как его называют, является типом цикла for, который используется с коллекциями, чтобы гарантировать, что все элементы в коллекции повторяются.Например,

for ( Object o : objects ) {
    System.out.println(o.toString());
}

Будет вызывать метод toString () для каждого объекта в коллекции "objects".В этом есть одна приятная вещь: вы не можете получить исключение за пределами допустимого.

1 голос
/ 02 мая 2011

Второй цикл for - это любой простой способ перебора содержимого массива без необходимости вручную указывать количество элементов в массиве (ручное перечисление). Это гораздо удобнее, чем первое, когда имеешь дело с массивами.

1 голос
/ 02 мая 2011

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

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