2012-06-14 1 views

Répondre

31

De nombreuses collections de Java produisent des itérateurs "fail-fast", ce qui signifie que si la collection est modifiée après la création d'un itérateur, l'itérateur sera invalidé et enverra un ConcurrentModificationException dès que possible. (Par rapport aux échecs de données postérieures ou de retour de données invalides.)

Afin de prendre en charge cette fonctionnalité, la collection doit garder une trace si elle a été modifiée. Chaque fois que la collection est modifiée, elle est incrémentée de modcount. Lorsque la collection produit un itérateur, l'itérateur stocke la valeur de modcount à partir de sa création. Ensuite, chaque fois que vous essayez d'utiliser l'itérateur, il vérifie si son modcount enregistré est différent du modcount actuel de la collection parente; si c'est le cas, l'itérateur échoue avec un ConcurrentModificationException.

(Une exception à cette règle est que les modifications à la collection faite par l'itérateur lui-même (comme méthode remove du iterator) ne remettent pas en cause l'itérateur.)

+1

Merci pour cette très bonne explication. Je savais qu'il a fait quelque chose comme ça, mais pas détaillé – moeTi

+0

Très bonne explication. Cela a maintenant du sens. –

+0

code: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList.ListItr – roottraveller

Questions connexes