Java为啥ArrayList#Iterator#next()要复制elementData字段的引用
感谢 @凳哥 的回答。 经过向一些大神求教,终于搞清楚了原因。首先ArrayList并不是线程安全的,所以可以排除是为了安全的考虑。可以看到两次检查游标,也都只是象征性地检查有没有超出数组边界。并没有检查控制线程冲突的modCount变量。这个引用的复制,其实很简单,就是出于效率的考量。因为内部类是通过保留指向外部类的指针访问外部类字段的。显式地写出来就是Itr.ArrayList.this.elementData。复制引用的目的就是为了少绕几道引用的弯。复制完之后,从内部类中直接访问拷贝的elementData就直接是Itr.elementData。从后面的代码看elementData被访问了两次,也就是说用一次O(1)的引用复制,省去了后面两次引用的转折。虽然性能的提升微乎其微,但毕竟聊胜于无。毕竟ArrayList这种主力容器的迭代器每天的访问量是惊人的。我经常会问自己,如果是我处理这样的问题,会不会斤斤计较到这样的地步。感叹之余,这样的精神确实值得学习。-------------------------------------------------------我的笔记栈 http://ciaoshen.com (笔记向,非教程)
■网友
我认为是一个defensive copy, 保证list在这个方法执行时内容版本的统一。
推荐阅读
- 为啥看到书柜上的藏书会有心旷神怡的感觉
- 为啥知乎上普便有一种【我在北上广深打工,所以拥有更好的视野】这样的错觉
- 为啥工商银行的用户体验如此之差
- 汽车|看了中消协4S店服务测评调查结果,终于知道法系车为啥卖不好了
- 你为啥从窝窝商城离职?
- 为啥5G和2.4G默认的BSSID是相同的
- 为啥电器实体店的价格比淘宝贵那么多
- 现在在线学习视频有很多了,为啥大部分人还是喜欢下载下来观看
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 为啥到现在你还没有女朋友 ?