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() 操作时,本质是会去重新检查集合本身是否有剩余元素。

所以在迭代器的循环过程中可以安全的移除集合自身的元素。

可以简单理解为:迭代器的本质就是从集合拿一个元素,并记下元素的位置,移除就去集合中移除当前元素,拿下一个就根据坐标去集合中重新生成一个新的迭代器实例;直到没有。


1
0

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2314 学习 · 476 问题

查看课程