【精】Java中的迭代器
大家好,我是山大,有到了我有一个朋友系列。
最近,山大的一个朋友问迭代器的问题,有感而发,写了这篇浅析。
问:辣系个炎热的夏天,他问我,为什么有了for循环,还要迭代器,为什么…mmmm,
答:这种问题怎么从你嘴里说出来,咳咳,编不下去了
本章目标
了解什么是迭代器,知道java中迭代器的使用和原理,增强for循环底层与实现。
迭代器的概念
在进入正题之前,我们先聊了解一下什么是迭代:
迭代的概念:
百度百科是这样描述的:
迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。此过程的每一次结果,都是由对前一次所得结果施行相同的运算步骤得到的。例如利用迭代法*求某一数学问题的解。
对计算机特定程序中需要反复执行的子程序*(一组指令),进行一次重复,即重复执行程序中的循环,直到满足某条件为止,亦称为迭代。
可以这么说,在java中迭代器中迭代就是重复获取集合中的元素,直到满足条件位置。如何获取,如何判断条件,就是方法了。
开发中:
我们都知道,Connection(所有单列集合的父接口),Set和List两个接口继承的就是Connection,开发中,经常需要遍历Connection集合中的所有元素。
如果用for循环就有些许麻烦,针对这种需求,从1.2版本开始,JDK给我们提供了一个一个专门的接口Iterator(java.util.Iterator)。
通过API搜索,下图:
小拓展:
在JDK1.0的时候的迭代,用的是Enumeration ,JDK1.2开始、Iterator代替了Enumeration ,至于为什么代替,可以去看一下API找一下Enumeration对比一下就知道了。有兴趣可以去了解一下。这里只是标明就不多说了,对比一下就知道了。
如何迭代(遍历)元素?
知道了什么是迭代,什么是迭代器之后,问题就来了:如何用迭代器如何遍历集合。
在迭代器中有这样的一个方法:public interface Iterator 上面图有标出
迭代器方法
不用全部,用给出的其中两个方法即可实现遍历:
boolean hasNext() 如果迭代具有更多元素,则返回 true 。
E next() 返回迭代中的下一个元素。
示例代码:
从上图可以明显看到运行的每一步。通过while循环,没循环一次获取一个 值,知道判断条件为false。
迭代器的实现原理:
每取出一位元素,下标(指针)往下移动一位。没错,就是这么简单。
JDK5特性增强for循环(for each):
关于增强for循环,是JDK5的特性,更加简化和方便。专门用来遍历数组和集合,其底层原理就是一个迭代器。它只是在迭代器的基础上简化了书写。所以同Iterator一样所有的单列集合都可以用增强for来遍历。
for(集合或数组的数据类型 名称:要遍历的数组或集合){
System.out.prinln(名称)
}
如:
List<String> in = new ArrayList<>();
for(String in: in){
System.out.prinln(名称)
}
-
问题:为什么迭代器和增强for在遍历的时候不能执行增删改查?
因为在通过迭代器/增强for来遍历集合元素的同时,增加或者删除集合中的元素,
【有可能】会导致某个元素被重复遍历或遍历不到。
为什么会这样,因为数组在增删改查的时候,在删除时,数组元素往前移,就会可能重新遍历到了。 -
问题:为什么所有单列集合都可以使用增强for?
因为所有单列集合的父亲(Collection)都继承了Iterator迭代器接口。寄语:
知识的海洋无比巨大!懂的越多,不懂的越多。
我是山大,下期见!
本章难免会有错
误和不足之处,作者原得到广大读者的指正。