2009-09-04 3 views
45

Является ли цикл java for-each гарантией того, что элементы будут представлены в порядке, если они вызваны в списке? В моих тестах это кажется, но я не могу найти это явно упомянуто в документацииJava For-Each Loop: Порядок сортировки

List<Integer> myList;// [1,2,3,4] 
for (Integer i : myList) { 
    System.out.println(i.intValue()); 
} 

#output 
1,2,3,4 

ответ

46

Да. Цикл foreach будет перебирать список в порядке, указанном в методе iterator(). См. documentation for the Iterable interface.

Если вы посмотрите на Javadoc for List, вы увидите, что список является «упорядоченной коллекцией» и что метод iterator() возвращает итератор, который выполняет итерацию «в правильной последовательности».

3

Вы можете использовать для цикла, а-ля for (int i = 0; i < myList.length(); i++), если вы хотите сделать это в упорядоченно. Хотя, насколько я знаю, foreach должен делать это по порядку.

+0

Да, но это действительно уродливо, я бы предпочел быть уверенным в каждом – Mike

15

Цикл foreach будет использовать итератор, встроенный в Collection, поэтому заказ вы получите результаты, будет зависеть, поддерживается ли или нет Collection какой-то порядок элементов.

Итак, если вы перебираете ArrayList, вы получите предметы в том порядке, в котором они были вставлены (если вы не продолжаете сортировать ArrayList). Если вы перебираете HashSet, все ставки неактивны, так как HashSets не поддерживает никаких заказов.

Если вам необходимо гарантировать заказ элементам в коллекции, определите Comparator, который устанавливает этот порядок и использует Collections.sort(Collection<T>, Comparator<? super T>).

10

Да, Java язык спецификации убедитесь, что

for (Iterator<Whatever> i = c.iterator(); i.hasNext();) 
    whatEver(i.next()); 

не эквивалентно

for (Whatever x : c) 
    whatEver(x); 

нет "Изменение заказа" допускается.

Смежные вопросы