Если итераторы, возвращаемые HashSet, ArrayList работают быстро, как мы можем использовать итератор remove () для удаления элементов из коллекции - PullRequest
0 голосов
/ 17 сентября 2018

Как все мы знаем, что Iterator s, возвращаемые ArrayList, HashMap, HashSet и т. Д., Не подвержены сбоям, но при использовании итератора remove() не выдает ConcurrentModificationException. Как?

отказоустойчивые итераторы выдают ConcurrentModificationException, если коллекция изменена во время итерации по ней. Но при удалении элементов из ArrayList или HashSet с использованием итератора remove() не выдает ConcurrentModificationException. Пожалуйста, объясните подробно.

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Это достигается следующим образом:

Коллекция содержит private int член с именем modificationCount (или что-то в этом роде). Каждый раз, когда вы используете один из методов, изменяющих коллекцию, этот modificationCount увеличивается.Когда вы создаете итератор в коллекции, итератор замечает текущее значение modificationCount коллекции, и каждый раз, когда вы вызываете итератор, он удостоверяется, что modificationCount не изменился, чтобы гарантировать, что коллекцияне был изменен во время итерации.Если итератор обнаружит, что modificationCount изменился, он выдаст ConcurrentModificationException.

Когда вы удаляете через iterator, итератор воздерживается от увеличения modificationCount коллекции.Это так просто.

0 голосов
/ 17 сентября 2018

, но при использовании итератора метод remove () не вызывает исключение ConcurrentModificationException.Как?

Поскольку это поведение явно задокументировано.

Для ArrayList:

, если список структурно измененв любое время после создания итератора, любым способом, кроме использования собственных методов итератора remove или add, итератор выдаст ConcurrentModificationException.

для HashSet:

, если набор изменяется в любое время после создания итератора, любым способом, кроме как через собственный метод remove итератора, итератор выдает ConcurrentModificationException.

Если вместо этого вы спросите , как это достигается , ну, исходный код (по крайней мере, для OpenJDK) находится в свободном доступе (и, вероятно, доступен для изучения непосредственно из вашей IDE):)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...