Подтвердить что ты не робот

Почему существуют два разных типа для циклов в java?

У меня есть цикл 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 петли?

4b9b3361

Ответ 1

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

Для этого

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);
}

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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