Порядок получения списка массивов - PullRequest
15 голосов
/ 28 февраля 2012

У меня есть java ArrayList, к которому я добавляю 5 объектов.

Если я перебираю список и распечатываю их, то перебираю список и распечатываю их снова.

Будет ли порядок поиска в этих двух случаях одинаковым?(Я знаю, что это может отличаться от порядка вставки)

Ответы [ 10 ]

24 голосов
/ 28 февраля 2012

Да, если вы не изменили промежуточный список.From http://docs.oracle.com/javase/6/docs/api/java/util/List.html:

iterator

Iterator<E> iterator()

Возвращает итератор для элементов в этом списке в правильной последовательности.

Возможно, немного неопределенно, но в других частях этой страницы этот термин определен:

правильная последовательность (от первого до последнего элемента)

10 голосов
/ 28 февраля 2012

(я знаю, что это может отличаться от порядка вставки)

Нет, не будет. Контракт List требует, чтобы порядок add был таким же, как порядок итерации, поскольку add вставляет в конце, а iterator создает итератор, который выполняет итерацию от начала до конца.

Set этого не требует, поэтому вы можете запутать контракт Set и List относительно порядка итерации.

Из Javadoc :

Iterator<E> iterator()

Возвращает итератор для элементов в этом списке в правильной последовательности.

6 голосов
/ 28 февраля 2012

Это в спецификации интерфейса List для сохранения порядка.

Это Set классы, которые не сохраняют порядок.

2 голосов
/ 28 февраля 2012

Да, ArrayList гарантирует порядок итераций для своих элементов - то есть они будут появляться в том же порядке, в котором вы их вставили, при условии, что вы не делаете никаких вставок во время итерации по ArrayList.

2 голосов
/ 28 февраля 2012

Если вы не изменяете список, порядок итераций останется прежним. Списки имеют контрактное задание порядка, а спецификация iterator гарантирует, что он выполняет итерации по элементам в этом порядке.

1 голос
/ 28 февраля 2012

Порядок итераций будет одинаковым при каждой итерации по одному и тому же неизмененному списку.

Кроме того, при условии добавления элементов с использованием метода add() порядок итераций будет таким же, как порядок вставки, поскольку этот метод добавляет элементы в конец списка.

1 голос
/ 28 февраля 2012

Когда вы добавляете элемент в ArrayList с помощью add(E e), этот элемент добавляется в конец списка. Следовательно, если все, что вы делаете, это вызываете метод с одним аргументом add несколько раз, а затем выполняете итерацию, то итерация будет в том же порядке, что и вызовы add.

1 голос
/ 28 февраля 2012

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

0 голосов
/ 18 июня 2013

Да, порядок поиска гарантированно будет таким же, если список не изменен, и вы используете тот же итератор, но необходимость полагаться на порядок поиска указывает на что-то подозрительное в дизайне.Как правило, не стоит основывать бизнес-логику на определенном порядке поиска.

0 голосов
/ 28 февраля 2012

Четные наборы вернут тот же результат, если вы не измените их (добавляя или удаляя элементы к ним).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...