java.util. ConcurrentModificationException в Не Многопоточная Программа

Это - компромисс, это, только программист может решить сделать.

Случай 1 сохраняет некоторую память и время запуска, не импортируя модуль даты и времени (и делая любую инициализацию, которой это могло бы потребовать), пока не необходимый. Обратите внимание, что выполнение импорта 'только, когда названо' также означает делать его 'каждый раз, когда названо', таким образом, каждый вызов после первого все еще подвергается дополнительным издержкам выполнения импорта.

Случай 2 сохраняет некоторое время выполнения и задержку путем импорта даты и времени заранее так, чтобы not_often_called () возвратился более быстро, когда это будет названо, и также не подвергаясь издержкам импорта на каждом вызове.

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

Лично я обычно следую за PEP за исключением вещей как модульные тесты и таким образом, что я всегда не хочу загружаемый, потому что я знаю , они не собираются быть используемыми за исключением тестового кода.

15
задан ShiDoiSi 18 January 2012 в 17:24
поделиться

3 ответа

. Вы можете изменить базовую коллекцию для Iterator (которая скрыта в для каждого цикла). Правильный способ сделать это:

for (Iterator<PopulationMember> it = population.iterator(); it.hasNext();) {
    PopulationMemeber p = it.next();
    int[] probs = ProbablityArrayDeath(GrowthRate,Death,(int)p.fitness());
    if (probs[RandomNumberGen.nextRandomInt(0, 99)] == 0) {
        it.remove();
    }
}
41
ответ дан 30 November 2019 в 23:57
поделиться

Вы не можете использовать для каждого цикла , если вы удаляете вещи из коллекции.
Вы должны использовать Iterator и удалить текущий вызов элемента Iterator.remove .

В противном случае базовый итератор, который цикл for-each создает для вас за кулисами, не будет 'Не понимаю, почему коллекция, через которую он проходит, меняется, сообщает вам, что она изменяется, пока вы ее повторяете.

12
ответ дан 30 November 2019 в 23:57
поделиться

У вас есть итератор по заполнению, скрытый под циклом for. Вы удаляете элемент из популяции в середине работы итератора. Итератор больше не может работать, потому что вы изменили коллекцию в середине его итерации.

Это не связано с многопоточностью.

8
ответ дан 30 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: