Java: лучший способ итерации через коллекцию (здесь ArrayList)

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

Итерация через коллекцию (здесь 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) {

}

Ответ 1

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

Второй полезен, когда вам не нужен индекс элемента, но, возможно, потребуется удалить элементы при повторении. Но это имеет недостаток в том, чтобы быть слишком многословным ИМО.

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

Ответ 2

Все они имеют собственные возможности:

  • Если у вас есть итерабельность и вам необходимо безоговорочно переходить ко всем из них:

    для (iterable_type iterable_element: collection)

  • Если у вас есть итерабельность, но нужно условно пройти:

    для (Итератор iterator = collection.iterator(); iterator.hasNext();)

  • Если структура данных не реализует итерацию:

    for (int я = 0; я < collection.length; я ++)

Ответ 3

Кроме того, коллекция stream() используется с Java 8

collection.forEach((temp) -> {
            System.out.println(temp);
});

Дополнительная информация о потоке Java и коллекциях для чудодейцев ссылка

Ответ 4

Ни один из них не "лучше", чем другие. Третье, для меня, более читаемое, но для тех, кто не использует foreaches, это может показаться странным (они могут предпочесть первый). Все 3 довольно понятны для всех, кто понимает Java, поэтому выбирайте то, что вам лучше помогает в коде.

Первый из них является самым основным, поэтому он является самым универсальным шаблоном (работает для массивов, все повторяющиеся, которые я могу придумать). Это единственное различие, о котором я могу думать. В более сложных случаях (например, вам нужно иметь доступ к текущему индексу или вам нужно отфильтровать список), первый и второй случаи могут иметь больше смысла, соответственно. Для простого случая (итерируемый объект, никаких особых требований), третий кажется самым чистым.

Ответ 5

Первый вариант - лучшая производительность (например, ArrayList реализует интерфейс RandomAccess). Согласно документу java, реализация List должна реализовывать интерфейс RandomAccess, если для типичных экземпляров класса этот цикл:

 for (int i=0, n=list.size(); i < n; i++)
     list.get(i);

работает быстрее, чем этот цикл:

 for (Iterator i=list.iterator(); i.hasNext(); )
     i.next();

Надеюсь, это поможет. Первый вариант будет медленным для последовательных списков доступа.

Ответ 6

Вот пример

Query query = em.createQuery("from Student");
             java.util.List list = query.getResultList();
             for (int i = 0; i < list.size(); i++) 
             {

                 student = (Student) list.get(i);
                 System.out.println(student.id  + "  " + student.age + " " + student.name + " " + student.prenom);

             }