Сегодня я с удовольствием писал код, когда добрался до фрагмента кода, который уже использовал сотни раз:
Итерации по коллекции (здесь ArrayList)
По какой-то причине я действительно посмотрел на параметры автозаполнения Eclipse, и это заставило меня задуматься:
В каких случаях следующие циклы лучше использовать, чем другие?
Классический цикл индексации массива:
for (int i = 0; i < collection.length; i++) {
type array_element = collection.get(index);
}
Итератор hasNext () / next ():
for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
type type = (type) iterator.next();
}
И мой любимый, потому что его так просто написать:
for (iterable_type iterable_element : collection) {
}
java
collections
for-loop
Джейсон Роджерс
источник
источник
for (Iterator<type> iterator = collection.iterator(); iterator.hasNext();) { type type = iterator.next(); }
Ответы:
Первый полезен, когда вам также нужен индекс элемента. Это в основном эквивалентно двум другим вариантам для
ArrayList
s, но будет очень медленным, если вы используетеLinkedList
.Второй полезен, когда вам не нужен индекс элемента, но может потребоваться удалить элементы во время итерации. Но у этого есть недостаток в том, что он слишком многословен.
Я также предпочитаю третью версию. Он короткий и работает во всех случаях, когда вам не нужны никакие индексы или базовый итератор (т.е. вы только обращаетесь к элементам, а не удаляете их или не изменяете
Collection
каким-либо образом - что является наиболее распространенным случаем).источник
Collection
них дешево получить по индексу).List
будет реализована в виде дерева, она будет работать медленнее).Все они имеют собственное применение:
Если у вас есть итерация, и вам нужно безоговорочно пройти ко всем из них:
for (тип-итерации элемент-итерируемый: коллекция)
Если у вас есть итерация, но вам нужно условно пройти:
for (Итератор iterator = collection.iterator (); iterator.hasNext ();)
Если структура данных не реализует итерацию:
для (int i = 0; i <collection.length; i ++)
источник
break
и / илиcontinue
В Java 8 также есть утилита stream () коллекций.
или
Дополнительная информация о потоке Java 8 и коллекциях для чудес по ссылке
источник
Ни один из них не «лучше» других. Третий вариант для меня более читабелен, но для тех, кто не использует foreache, это может показаться странным (они могут предпочесть первое). Все 3 довольно понятны любому, кто разбирается в Java, поэтому выберите то, что заставляет вас чувствовать себя лучше в коде.
Первый - самый простой, так что это наиболее универсальный шаблон (работает для массивов, всех итераций, которые я могу придумать). Это единственная разница, о которой я могу думать. В более сложных случаях (например, вам нужен доступ к текущему индексу или вам нужно отфильтровать список), первый и второй случаи могут иметь больше смысла соответственно. Для простого случая (повторяемый объект, никаких особых требований) третий кажется самым чистым.
источник
Первый вариант лучше по производительности (поскольку ArrayList реализует интерфейс RandomAccess). Согласно java-документу, реализация List должна реализовывать интерфейс RandomAccess, если для типичных экземпляров класса этот цикл:
работает быстрее, чем этот цикл:
Я надеюсь, что это помогает. Первый вариант будет медленным для списков последовательного доступа.
источник
Вот пример
источник