10分50秒开始,这个集合是在方法内生成的,为什么会被cancel影响到呢?
来源:10-2 并发客户端BUG修复与性能优化-1
陈佳凯
2022-09-02
for循环和迭代器本质上好像没有区别。另外,remove掉迭代器当前元素有什么意义呢,这个迭代器在用完就丢掉了
写回答
1回答
-
Qiujuer
2022-09-06
for循环和迭代器 是两个完全不同的东西哟。
for循环的本质是循环一个字增变量,然后根据自增变量去get(index)到具体的内容,再进行处理;在整个循环过程中,for的终点是当前集合的size(一般来说是这样,除非你每次都重新拿size())。
这意味着你有10个数据,那么将会循环10次,如果在过程中去移除了集合的内容,本身集合会少于10个,但循环依然会进行10次,此时就会遇到数组越界的异常。
而迭代器的原理是:将集合的某个开始位置的元素(顺序头部,倒叙尾部)作为一个参数传递给一个新的实例,这个实例是迭代器的实现;并且当前迭代器引用了集合本身。
当我们调用迭代器.remove() 操作时,其本质是会移除掉引用的集合自身的元素
而我们每次调用迭代器.next() 操作时,本质是会去重新检查集合本身是否有剩余元素。
所以在迭代器的循环过程中可以安全的移除集合自身的元素。
可以简单理解为:迭代器的本质就是从集合拿一个元素,并记下元素的位置,移除就去集合中移除当前元素,拿下一个就根据坐标去集合中重新生成一个新的迭代器实例;直到没有。
10
相似问题