For循环为什么不能对集合进行删除操作
原因
当我们对一个List进行遍历删除时我们会发现它会给我们报ConcurrentModificationException异常,那它背后是什么机制呢???
这是因为forEach里的Iterator迭代对象是工作在一个独立的线程中的,并且会拥有一个mutex的锁,所以Iterator在被创建之后呢,会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,也就是我们的这个集合发生变化的时候呢,这个索引表的内容。是不会同步去改变的;
所以,当索引指针往后移动的时候就找不到要迭代的对象了,这时,就按照fail- fast原则,使得Iterator,马上抛出java.util.ConcurrentModificationException异常;
因此Iterator在工作的时候呢,是不允许被迭代的对象,因为某种原因动态的去改变,也就是不支持调用集合的remove方法,在遍历的过程中动态地去移除元素;
但是呢,我们可以使用Iterator本身的remove方法来删除对象,因为Iterator的remove方法呢,会在删除当前迭代对象的同时去维护单链索引表的一致性,
因此,咱们可以考虑使用迭代器的方式来遍历集合的方式来对元素进行删除。
例如:
Iterator<String> it = list.iterator();
while(it.hasNext()){
String a= it.next();
if(a.length()==0){
it.remove();
}
}