前几天有个同事问我为什么这样删除会报错,以前没注意过,现在简单聊聊。从报错的情况来看,猜测是这个增强版的for循环应该是被javac编译成迭代器了,于是用javap -verbose class路径,得到下图
果然是编译成了迭代器,这个所谓增强版的for循环只是个语法糖,下面来简单分析为什么报错,在增强版for循环中调用的是list删除而不是迭代器的删除。
请注意红色圈圈的变量,当增强版内部执行删除后,就会再次调用迭代器的next
因为删除没有调用迭代器的remove,导致expectedModCount没有变化,造成了modcount和expectedModCount不等,便抛出异常了,此时基本上已经解释增强版的for循环为什么报错的原因.接下来在聊聊RandomAccess,这个类的注释解释的很清楚,对于实现这个接口的类循环时用for比迭代器快,而对于arraylist也实现了这个类,当然用arraylist循环是不建议用迭代器和增强版的for循环。不过以前我用增强版for循环非常之多,汗颜呢。
第一次写博客,写的不好之处多多包涵,共同学习,最后推荐个群阿里冯大神的群,群号码:397633380,希望能共同学习。