前情回顾

自从我上次发了《这道Java基础题真的有坑!我求求你,认真思考后再回答。》这篇文章后。我通过这样的一个行文结构:

解析了小马哥出的这道题,让大家明白了这题的坑在哪里,这题背后隐藏的知识点是什么。

但是我是万万没想到啊,这篇文章居然还有续集。因为有很多读者给我留言,问我为什么?怎么回事?啥情况?

问题片段一:到底循环几次?

有很多读者针对文章的下面的这个片段:

来问了一些问题:为什么会循环三次?循环二次?循环一次?

源码看的脑袋疼。那我觉得我需要"拯救"一下这个哥们了。

问题片段二:为什么删除第一个不出错?

还有这个片段,对于为什么删除第一个元素不会抛出异常,也是一众选手,不明就里:

为什么?为什么没有问题啊?

提炼问题

上面看着有点乱是不是呢?

那肯定是你没看过我这篇文章《这道Java基础题真的有坑!我求求你,认真思考后再回答。》。没关系,我先把问题提炼出来,然后有兴趣你可以再去看看这篇文章。

在描述问题之前,需要说明一下,为了方便演示说明,我会去掉Java的foreach语法糖,直接替换为编译后的代码,如下:

请坐稳扶好,下面的几个问题有点绕。主要是看图,先知道这几个现象。之后我还会把问题再简化一下。

问题一:如图所示,为什么删除第一个元素(公众号)可以正常执行,删除第二个元素(why技术)就会抛出异常呢?

问题二:为什么当集合大小大于2时,删除第一个元素(公众号)也抛出了异常?

问题三:为什么删除倒数第二个元素可以正常执行?删除倒数第二个元素以外的任意元素就会抛出异常?

问题四:为什么在删除完成之后立即break,则可以删除任意元素呢?

问题五:如图所示,为什么注释掉判断语句直接remove("why技术")不会报错,而加上判断语句就报错了呢?

问题六:为什么判断"why技术"并remove的时候循环三次?为什么注释掉remove只循环两次?为什么判断"公众号"并remove的时候只循环一次?

我再把问题汇总一下,你瞟一眼就行,不用细读:

问题一:当集合大小等于2时,为什么删除第一个元素(公众号)可以正常执行,删除第二个元素(why技术)就会抛出异常呢?

问题二:为什么当集合大小大于2时,删除第一个元素(公众号)也抛出了异常?

问题三:为什么删除倒数第二个元素可以正常执行?删除倒数第二个元素以外的任意元素就会抛出异常?

问题四:为什么在删除完成之后立即break,则可以删除任意元素不会报错呢?

问题五:为什么注释掉判断语句直接remove(why技术)不会报错,而加上判断语句就报错了呢?

问题六:为什么判断"why技术"并remove的时候循环三次?为什么注释掉remove只循环两次?为什么判断"公众号"并remove的时候只循环一次?

晕不晕?

不要晕。上面我只是为了把各种情况都执行一下,然后截图出来,方便大家有个直观的理解。其实,上面的这六个问题,我在看来就只有两个问题: