Сравнение типов для цикла

1

В чем разница между этими двумя для синтаксиса цикла и когда каждый используется:

for (String word : words) {

}

for (int i = 0; i < words.size(); i++) {

}

word - это строковая переменная, а слова - это массив.

Теги:
string
for-loop
syntax

9 ответов

1
Лучший ответ

Первый, который вы написали, - это цикл foreach. Это специальный цикл, в котором вы легко перемещаете все экземпляры из массива или коллекции. Таким образом, вам не нужна другая переменная для сохранения индекса, но для ее использования у вас должен быть массив или набор элементов.

Второй - это базовый цикл, который дает вам больше опций - вы можете использовать его не только для циклического перемещения по коллекциям, но и для повторения процедуры несколько раз. Поэтому вам не нужен массив или коллекция.

То, как вы использовали эти циклы в ваших примерах, не имеет значения, кроме того, что первый пример легче читать.

2

если вам нужна индексная переменная "i", используйте обычный цикл, иначе используйте цикл foreach, то есть

for (String word : words).
2

Практически существует разница: у вас нет индекса текущего элемента.

Технически существует большая разница. Цикл foreach работает только с объектами Iterable. В Java все коллекции (List, Vector, Map, Set) и массивы являются, например, итерабельными. Это в основном классы, implement Iterable. Это для каждого цикла:

for (String word : words)
{

}

компилируется примерно так:

for (Iterator<String> it = words.iterator(); it.hasNext(); )
{
    String word = it.next();

}

Для интерфейса Iterable требуется метод Iterator<T> iterator().

Другое отличие состоит в том, что при использовании подхода "каждый" базовые итераторы не позволяют вам изменять коллекцию, по которой вы выполняете итерацию. Зачем? Потому что, что произойдет, если вы находитесь в цикле foreach, и вы вставляете или удаляете элемент? Это не имело бы смысла и поэтому запрещается. Если вы попытаетесь это сделать, вы получите ConcurrentModificationException. Вы можете сделать это с помощью классического цикла, но при этом вы должны быть осторожны.

2

Первый называется "Enhanced" for loop и работает на массивах, а также любой класс, реализующий интерфейс java.lang.Iterable. Так что не только коллекции. : ^)

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

1

Цикл for-each избавляется от беспорядка и возможности ошибки, полностью скрывая переменную итератора или индекса.

for (String word : words) {

}

Цикл выше читается как "для каждого слова в словах".

Для использования традиционного for-each цикла никакого штрафа за производительность не существует.

0

Первая нотация создает объект указанного класса для каждого элемента коллекции. Второе обозначение полезно с примитивными массивами. Однако Java 8 вводит новую нотацию для итерации через коллекцию.

myIterable.forEach(element -> doSomething...);
  • 0
    Новый метод - это не только коллекции, но и все элементы Iterables. ;)
  • 0
    Спасибо @reegnz, другие классы, кроме коллекций, реализуют интерфейс Iterable
0

Я не знаю, какой язык вы используете, но я предполагаю, что Java так для первого цикла называется a для каждого цикла II, как правило, его используют, когда есть итерация или даже список

List<String> myList = new ArrayList<String>();

однако вот более наглядный ответ

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

  • Присвоение элементов: избегайте использования цикла for-each, когда вам нужно назначить значение элементу. Этот цикл может использоваться, когда требуется только доступ.
  • Использование с единой структурой: вы не можете использовать цикл, когда вам нужно сравнить два массива в ситуации.
  • Только повторные итерации: используйте цикл "for-each" только для прямого цикла, и это тоже за один шаг.
  • Совместимость. Если вам нужен ваш код для совместимости с версиями до Java 5, вам может понадобиться регулярный цикл.

так как для цикла "for" он может использоваться, когда конкретная задача должна повторяться несколько раз

например, здесь, если words.size() равно 10, цикл будет повторяться 9 (потому что не существует равных только <) раз

for (int i = 0; i < words.size(); i++) {
  System.out.println("My output");
}

source: https://www.udemy.com/blog/for-each-loop-java/ вот аналогичный вопрос, который задавался раньше. Когда использовать цикл for в цикле while?

0

вероятно, это зависит от языка, но я полагаю, что нет никакой разницы.

Синтаксис первого примера проще, но нет счетчика, поэтому вы должны, вероятно, также объявить другую переменную. Во втором случае у вас это уже есть.

0

Эти две циклы, которые вы закодировали, не совсем эквивалентны. Эти два ближе:

for (String word : words) {

}

for (int i = 0; i < words.size(); i++) {
    String word = words[i];

}

Обратите внимание на объявление переменной String и присвоение ей.

Первый цикл, известный как цикл foreach, объявляет, присваивает и итерации, и тот же синтаксис может использоваться для перебора коллекций (т.е. Объектов с возможностью итерации).

Единственным недостатком является то, что у вас нет доступа к индексу. Если вам это не нужно, используйте foreach.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню