Java для каждого цикла: порядок сортировки
Является ли цикл java for-each гарантией того, что элементы будут представлены в порядке, если они вызваны в списке? В моих тестах это похоже, но я не могу найти это явно упомянутое в любой документации
List<Integer> myList;// [1,2,3,4]
for (Integer i : myList) {
System.out.println(i.intValue());
}
#output
1,2,3,4
Ответы
Ответ 1
Да. Цикл foreach будет проходить через список в порядке, указанном методом iterator()
. См. Документацию для интерфейса Iterable.
Если вы посмотрите Javadoc for List, вы увидите, что список - это "упорядоченная коллекция" и что метод iterator()
возвращает итератор, который выполняет итерацию "в правильной последовательности".
Ответ 2
Цикл foreach
будет использовать итератор, встроенный в Collection
, поэтому получаемый вами порядок будет зависеть от того, поддерживает ли Collection
какой-то порядок для элементов.
Итак, если вы зацикливаете на ArrayList
, вы получите элементы в том порядке, в котором они были вставлены (если вы не собираетесь сортировать ArrayList). Если вы зацикливаете на HashSet
, все ставки отключены, так как HashSets не поддерживает никакого упорядочения.
Если вам нужно гарантировать порядок для элементов в коллекции, определите Comparator
, который устанавливает этот порядок и использует Collections.sort(Collection<T>, Comparator<? super T>)
.
Ответ 3
Да, спецификации языка Java гарантируют, что
for (Iterator<Whatever> i = c.iterator(); i.hasNext(); )
whatEver(i.next());
эквивалентно
for (Whatever x : c)
whatEver(x);
не допускается "изменение порядка".
Ответ 4
Вы можете использовать цикл for, a la for (int i = 0; i < myList.length(); i++)
, если хотите сделать это упорядоченным образом. Хотя, насколько я знаю, foreach должен делать это по порядку.