小问题3 | foreach和iterator有什么区别?
前置问题来自:小问题1 | 如何遍历ArrayList?遍历ArrayList的3种方法
从两个角度讲,
逻辑角度的:
-
当需要删除序列元素时,foreach循环会发生错误
以List为例,如果在循环的过程中调用集合的remove()方法,就会导致循环出错,因为循环过程中list.size()的大小变化了。
在循环的过程中调用iterator的remove()方法则不会出现这种问题。
效率角度的:
-
访问效率随数据结构不同而不同
- 采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快。
- 采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快。
-
Iterator 可以使用相同方式去遍历集合
使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口)
- 如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改
- 如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样。
在了解了上述内容之后,可能有朋友会产生一个新问题:
迭代器Iterator的的remove()方法和集合的remove()方法有什么区别?
为什么一个可以,另一个就不行?
我们带着这个问题继续看。
————————————————————
本专栏是【小问题】系列,旨在每篇解决一个小问题,并秉持着刨根问底的态度解决这个问题可能带出的一系列问题。