2012-02-27 3 views
13

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

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

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

ответ

22

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

итератора

Iterator<E> iterator()

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

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

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

+1

Они могли бы сделать лучше, чем заявить «правильную последовательность» :-) –

+4

@ TheNail - Ну, документы для 'List' действительно говорят в начале, что« Список »есть« упорядоченная коллекция (также известная как _последовательность_)." –

2

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

-2

Даже Наборы вернутся тот же результат, если вы его не модифицируете (добавление или удаление элементов).

+2

На практике это часто верно, но это не гарантируется (кроме SortedSet!). В теории вы можете столкнуться с набором, который реорганизует свою внутреннюю структуру за кулисами ... – DNA

+2

Нет никакой гарантии, что Set не будет реорганизоваться внутри себя в любое время. Нет никакой гарантии, что итерации будут установлены в любом конкретном порядке или что порядок не изменится с одного итератора на другой. –

+0

См. Также этот * родственный, но не тот же вопрос * SO и его ответ: http://stackoverflow.com/questions/2704597/iteration-order-of-hashset –

6

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

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

1

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

1

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

1

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

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

10

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

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

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

От Javadoc:

Iterator<E> iterator()

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

2

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

-1

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

+0

Этот ответ в значительной степени является повторением существующих ответов. –

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