Порядок поиска списка массивов
У меня есть java ArrayList
, к которому я добавляю 5 объектов.
Если я перебираю список и распечатываю его, перебираем по списку и распечатываем его снова.
Будет ли порядок извлечения в этих двух случаях одинаковым? (Я знаю, что это может отличаться от порядка вставки)
Ответы
Ответ 1
Да, если вы не изменили промежуточный список. Из http://docs.oracle.com/javase/6/docs/api/java/util/List.html:
итератора
Iterator<E> iterator()
Возвращает итератор по элементам в этом списке в правильной последовательности.
Немного неопределенный, возможно, но в других частях этой страницы этот термин определяется:
правильная последовательность (от первого до последнего элемента)
Ответ 2
(я знаю, что это может отличаться от порядка вставки)
Нет, не будет. Контракт List
требует, чтобы порядок add
был таким же, как и порядок итерации, так как add
вставляет в конце, а iterator
создает итератор, который выполняет итерацию от начала до конца по порядку.
Set
не требует этого, поэтому вы можете ввести в заблуждение договор Set
и List
относительно порядка итерации.
Из Javadoc:
Iterator<E> iterator()
Возвращает итератор по элементам в этом списке в правильной последовательности.
Ответ 3
Это в спецификации интерфейса List
для сохранения порядка.
Это классы Set
, которые не сохраняют порядок.
Ответ 4
Если вы не мутируете список, то порядок итераций останется неизменным. Списки имеют заказываемый по контракту порядок, а спецификация iterator
гарантирует, что он выполняет итерацию по элементам в этом порядке.
Ответ 5
Да, ArrayList
гарантирует порядок итерации по своим элементам - то есть они выйдут в том же порядке, в который вы их вставляли, при условии, что вы не делаете никаких вставок, итерации по ArrayList
.
Ответ 6
Извлечение не меняется, если вы не измените используемый итератор. Пока вы используете тот же метод для извлечения и не изменили сам список, элементы будут возвращены в том же порядке.
Ответ 7
Когда вы добавляете элемент в ArrayList с помощью add(E e)
, этот элемент добавляется в конец списка. Следовательно, если все, что вы делаете, вызывает метод с одним аргументом add
несколько раз, а затем итерацию, то итерация будет в том же порядке, что и вызовы add
.
Ответ 8
Порядок итераций будет одинаковым при каждом повторении по одному и тому же немодифицированному списку.
Кроме того, если вы добавите элементы с помощью метода add()
, порядок итераций будет таким же, как и порядок вставки, поскольку этот метод добавляет элементы в конец списка.
Ответ 9
Да, порядок поиска гарантированно будет таким же, пока список не будет мутирован, и вы используете тот же самый итератор, но для того, чтобы полагаться на порядок извлечения, было указано что-то подозрительное в дизайне. Как правило, не очень хорошая идея основывать бизнес-логику на определенном порядке поиска.
Ответ 10
Even Sets вернут тот же результат, если вы не измените их (добавление или удаление элементов).