Как вы взаимодействуете с коллекцией <T>и изменяете ее элементы без исключения ConcurrentModificationException? - PullRequest
0 голосов
/ 13 января 2010

Мне нужно сделать что-то вроде этого ...

Collection<T> myCollection; ///assume it is initialized and filled


for(Iterator<?> index = myCollection.iterator(); index.hasNext();)
{
    Object item = index.next();
    myCollection.remove(item);
}

Очевидно, это вызывает исключение ConcurrentModificationException ...

Итак, я попробовал это, но не кажется элегантным / эффективным и выбрасывает тип безопасности: непроверенное приведение от объекта к T предупреждение

* +1007 *

Ответы [ 2 ]

6 голосов
/ 13 января 2010

Вы можете просто использовать iterator.remove():

for(Iterator<?> index = myCollection.iterator(); index.hasNext();)
{
    Object item = index.next();
    index.remove();
}

Помните, что это может привести к O(n^2) времени выполнения для некоторых типов данных (например, ArrayList). В этом конкретном случае может быть эффективнее просто очистить коллекцию после итерации.

0 голосов
/ 13 января 2010

Обращаем ваше внимание на то, что тип оригинальной коллекции имеет значение и в этом случае. Например, Arrays.asList(new Integer[]{1, 2, 3}); странным образом создает UnmodifiableList, и в этом случае вам нужно будет создать пустой экземпляр ArrayList для выполнения newList.addAll(Arrays.asList(new Integer[]{1, 2, 3});.

...