Concepts de modification de l’élément dans la collection en itérant?

J’ai trouvé cette déclaration si un thread modifie une collection directement alors qu’il parcourt la collection avec un iterator à échec rapide, l’iterator lève cette exception. à l’ adresse http://download.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html .

J’ai trouvé la modification simultanée est même jeté dans le code ci-dessous

List lista= new ArrayList(); Employee emp1=new Employee(); Employee emp2=new Employee(); Employee emp3=new Employee(); lista.add(emp1); lista.add(emp2); lista.add(emp3); for(Employee emp:lista) { emp2.setEmpId(2); lista.remove(emp2); } 

Question 1: – Puis-je dire que Enhan for Loop utilise également l’iterator Fail-Fast en interne? Bien que, lorsque j’exécute le code ci-dessous, il fonctionne correctement.

 for(int i=0;i<lista.size();i++) { Employee empTemp=lista.get(i); lista.remove(emp2); } 

Question2: – Une autre question est quand affirmation dire

si un fil modifie une collection

Je suppose que la modification signifie ici la suppression ou l’ajout, et non la mise à jour de l’élément dans la collection pour l’interface liste, alors qu’il inclut également la modification de l’élément pour l’interface set. Droite? Au moins les programmes que j’ai essayés sont le cas avec eux.

modifier

En ce qui concerne set, je doute de ma déclaration ci-dessus, c’est-à-dire qu’il lève une exception de modification simultanée lorsque nous essayons de modifier set en itérant. J’ai essayé le code ci-dessous mais il n’a pas levé d’exception.

 HashSet set1= new HashSet(); Employee emp4=new Employee(); Employee emp5=new Employee(); Employee emp6=new Employee(); set1.add(emp4); set1.add(emp5); set1.add(emp6); Iterator iter1=set1.iterator(); while(iter1.hasNext()) { Employee emp12=(Employee)iter1.next(); System.out.println(""); emp5.setEmpId(2); } 

Idéalement selon l’instruction, si l’ensemble est modifié à tout moment après la création de l’iterator à l’ adresse http://download.oracle.com/javase/6/docs/api/java/util/HashSet.html, il devrait lever l’exception de modification simultanée. mais ça n’a pas été le cas. Pas certain de pourquoi?

Question 1: – Puis-je dire que Enhan for Loop utilise également l’iterator Fail-Fast en interne? Bien que, lorsque j’exécute le code ci-dessous, il fonctionne correctement.

Oui c’est vrai. javap le code compilé avec la commande javap pour vérifier si vous le souhaitez.

Je suppose que la modification signifie ici la suppression ou l’ajout, et non la mise à jour de l’élément dans la collection pour l’interface liste, alors qu’il inclut également la modification de l’élément pour l’interface set. Droite? Au moins les programmes que j’ai essayés, c’est le cas avec eux.

C’est vrai, si vous faites emp1.setEmpId(2) ou quelque chose de similaire, l’itération n’échouera pas.

… elle devrait lever l’exception de modification simultanée, mais elle ne l’a pas fait. Pas certain de pourquoi?

Il ne lève l’exception que si vous modifiez la liste . N’oubliez pas que la liste contient des références à des objects. Si vous modifiez les objects, les références ne changent pas et la liste ne change pas.

À moins que l’access ne soit effectué par deux threads différents, il n’y a aucun danger à modifier les éléments de la liste. Votre for ne lève pas d’ concurrent modification exception parce que vous modifiez les éléments de l’ensemble, pas l’ensemble lui-même.