Почему существуют два разных типа для циклов в 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
петли?
Ответы
Ответ 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
, который теоретически оптимизирован для типа коллекции.