Java为啥ArrayList#Iterator#next()要复制elementData字段的引用

感谢 @凳哥 的回答。 经过向一些大神求教,终于搞清楚了原因。首先ArrayList并不是线程安全的,所以可以排除是为了安全的考虑。可以看到两次检查游标,也都只是象征性地检查有没有超出数组边界。并没有检查控制线程冲突的modCount变量。这个引用的复制,其实很简单,就是出于效率的考量。因为内部类是通过保留指向外部类的指针访问外部类字段的。显式地写出来就是Itr.ArrayList.this.elementData。复制引用的目的就是为了少绕几道引用的弯。复制完之后,从内部类中直接访问拷贝的elementData就直接是Itr.elementData。从后面的代码看elementData被访问了两次,也就是说用一次O(1)的引用复制,省去了后面两次引用的转折。虽然性能的提升微乎其微,但毕竟聊胜于无。毕竟ArrayList这种主力容器的迭代器每天的访问量是惊人的。我经常会问自己,如果是我处理这样的问题,会不会斤斤计较到这样的地步。感叹之余,这样的精神确实值得学习。-------------------------------------------------------我的笔记栈 http://ciaoshen.com (笔记向,非教程)
■网友
我认为是一个defensive copy, 保证list在这个方法执行时内容版本的统一。


    推荐阅读