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