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 должен делать это по порядку.