В ответ на этот комментарий от OP.
Однако # 1 требуется при обновлении (если не просто изменение текущего элемента или построение результатов в виде нового списка) и поставляется синдекс.Поскольку в этом случае List <> является ArrayList <>, get () (и size ()) равны O (1), но это не одно и то же для всех типов контрактов List.
Давайте рассмотрим следующие проблемы:
Конечно, get(int)
не является O(1)
для всех реализаций List
контракта.Однако AFAIK size()
равен O(1)
для всех List
реализаций в java.util
.Но вы правы, что # 1 неоптимален для многих реализаций List
.Действительно, для таких списков, как LinkedList
, где get(int)
равно O(N)
, подход # 1 приводит к итерации списка O(N^2)
.
В случае ArrayList
, это просто сделать вручную hoist вызов size()
, присвоение его (окончательной) локальной переменной.С этой оптимизацией код # 1 значительно быстрее, чем в других случаях ... для ArrayList
s.
Ваша точка зрения об изменении списка при итерации элементов вызывает ряд проблем:
Если вы делаете это с помощью решения, которое явно или неявно использует итераторы, то в зависимости от класса списка вы можете получить ConcurrentModificationException
с.Если вы используете один из классов одновременной коллекции, вы не получите исключение, но javadocs заявляет, что итератор не обязательно вернет все элементы списка.
Если высделайте это, используя код # 1 (как есть), тогда у вас есть проблема.Если модификация выполняется одним и тем же потоком, вам нужно настроить индексную переменную, чтобы избежать пропущенных записей или вернуть их дважды.Даже если вы все сделаете правильно, запись списка, одновременно вставленная до текущей позиции, не будет отображаться.
Если изменение в случае # 1 выполняется другим потоком, онотрудно правильно синхронизировать.Основная проблема заключается в том, что get(int)
и size()
являются отдельными операциями.Даже если они синхронизируются по отдельности, ничто не мешает другому потоку изменить список между вызовами size
и get
.
Короче говоря, итерация списка, которыйБыть модифицированным одновременно сложно, и его следует избегать ... , если вы действительно не знаете, что делаете .