Iterator源码逐条解析

一家之言 姑妄言之 絮絮叨叨 不足为训

Iterator接口注释翻译:

   集合上的迭代器。迭代器在Java集合框架中代替了枚举。迭代器与枚举有两个不同之处:
   1.迭代器允许调用者使用定义良好的语义在迭代期间从基础集合中删除元素。
   2.方法名已经得到了改进。
   该接口是Java集合框架的成员。


笔者废话:

   这里的Iterator译为迭代器,那么对于我来说,其实这就是个循环对象而已。它作为一个接口,也就是一个对象,其工作就是遍历集合中的对象,当然,这些集合对象需要去实现它。你可以理解它为for循环的变种,但是这里也仅仅表明“理解”而不是等同。
   也只有实现了Iterator接口的对象才能调用其方法,这点是毋庸置疑的。所以,我们也可以理解为Iterator就是那些实现了它的集合本身所拥有的属性,而这个属性也规定了,我们的集合,是可以遍历的。


Iterator接口信息:

public interface Iterator<E>

   我们可以清楚的看到,Iterator是一个接口,而且这里还规定了泛型机制。而通过接口注释来看,这个泛型E就是这个迭代器返回的元素的类型。


Iterator接口方法信息:

/**
 * 如果该迭代器内有更多的元素,则返回true。换句话说,如果next将返回
 * 一个元素而不是抛出一个异常,则返回true
 * @return 如果该迭代器内有更多的元素,则为真
 */
boolean hasNext();

   这个方法意在询问当前遍历的容器中是否含有下一个元素。这里会涉及到一个指针操作,当然,我们java宣称的可是没有指针,所以,这我们可以把它称之为“指向”。一般来说,如果我们使用了某个集合的Iterator对象后,会在这个集合的上方出现一个空值,而我们的Iterator对象就指向这个空值
   但是需要注意的是,这个方法仅仅是询问下一个元素是否存在,此时并不移动指向位置,只有调用了next()方法后,这个指向位置才会进行移动,即,移动到下一项。

/**
 * 返回迭代器中的下一个元素。
 * @return 返回迭代器中的下一个元素。
 * @throws 如果迭代没有更多的元素则抛出NoSuchElementException异常
 */
E next();

   这个方法是与hasNext()方法遥相呼应的。它代表着返回迭代器中的下一个元素。一般来说,我们都会通过hasNext()方法来判断是否有下一个元素,一旦有,那么就调用next()方法展示(取出)这个元素。
   重复上面的一段话:调用了next()方法后,容器的指向位置会进行移动,即,移动到下一项。

/**
 * 从基础集合中移除此迭代器返回的最后一个元素(可选操作)。此方法在每次
 * 调用next时只能调用一次。如果在迭代过程中以调用此方法以外的任何方式
 * 修改了底层集合,则迭代器的行为是未指定的。
 * 
 * @implSpec
 * 默认实现抛出UnsupportedOperationException异常,不执行其他操作。
 * 
 * @throws 如果这个迭代器不支持删除操作则抛出
 * UnsupportedOperationException异常
 * @throws 如果尚未next()方法,或者在最后一次调用next()方法之后已经
 * 调用了remove方法则抛出IllegalStateException异常
 */
default void remove() {
    throw new UnsupportedOperationException("remove");
}

   这个移除方法其实挺有的说的。
   首先,我们看它的修饰符,是default。这个default区别于我们类里面成员属性的default。这个是JAVA 1.8给接口新添加的特性。它表示我们可以在接口里面进行方法的默认实现。当然,这个方法也可被其实现类进行重写
   其次,这个方法删除的是上一次调用了next()方法时返回的元素。所以,这个方法必须在调用next()方法之后才可调用,如果在next()方法之前调用将会抛出IllegalStateException异常。这块不是绝对啊,这块不是绝对啊,你试试ArrayList就行了。试一下只添加一个元素就开始遍历,试试啊小可爱~
   再次,我们从其代码入手,会发现它默认抛出UnsupportedOperationException异常。其本质是告诉我们,不是所有的实现类都支持Iteratorremove()移除操作。所以,这个方法肯定是会由其部分实现类进行重新覆写,而不是仅仅提供一个无用的方法。
   这里就不再举例了,因为本身这就是一个接口,其各自的实现类都几乎重写了这个方法,所以这里即使举例也是利用其实现类。并且,各自的实现还略有差别。因此,大家可以移步我其他的集合源码分析篇章来具体查看这些示例。

/**
 * 为每个剩余元素执行给定的操作,直到处理完所有元素或操作引发异常。
 * 如果指定了迭代的顺序,则按照迭代的顺序执行操作。操作引发的异常将
 * 被转发给调用者。
 * 
 * @implSpec
 * 默认实现的行为就像:
 *  while (hasNext())
         action.accept(next());
         
 * @param action The action to be performed for each element
 * @throws NullPointerException if the specified action is null
 * @since 1.8
 */
default void forEachRemaining(Consumer<? super E> action) {
    Objects.requireNonNull(action);
    while (hasNext())
        action.accept(next());
}

   这里是Iterator接口中最后一个方法,它也是JAVA1.8新定义的一个方法。需要注意的是它也是一个被default修饰符修饰的方法,即,它也是这个接口多定义具有默认实现的方法。
   从方法名来看,它就是一个遍历方法,只不过它遍历的是剩余元素。那么从注释上面来看,也表明了该方法为每个剩余元素执行给定的操作,直到处理完所有元素或操作引发异常。
   不过这里笔者需要表明的是,这里所谓的“剩余”其实无所谓。我们从其代码来看,它就是在遍历元素,然后对遍历出的元素做出某种操作。当然,这种操作我们还是需要具体到实现类的。
   当然,根据我们文章的总意,还是需要讲解一下其代码的内部实现。
   首先我们可以看到其传进来的参数是一个Consumer<? super E>类,它是一个函数式编程接口。这个行为也表明了我们需要处理的元素必须是当前Iterator泛型内指定类型的子类,或其本类。
   接下来的代码会对其进行一次非空判断,只有通过判断才可以进行下一步操作。
   当我们的参数通过了非空判断之后,剩下的,就开始了while循环进行遍历。然后对其遍历的元素进行处理。当然,这种处理之前也说过了,是需要具体到实现类的。到底做了什么处理,不能从这里得知,而应该去看其具体的实现方法
   这些具体的实现方法我会在其具体的实现类里面具体做介绍,这里还是不掺杂那么多的解释或举例。仅仅留给这个Iterator接口一个说一是一的解析吧。
   至此,我们Iterator到此全部解析完毕(ಥ_ಥ)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354