日期:2014-05-19  浏览次数:20779 次

请教一个关于Iterator的问题
我想问下,如果把对ArrayList的用iterator遍历改为for(int i=0;i <size; i ++),在量大的情况下,性能能有提升吗?
现在情况是这样的:
最近在优化cpu,发现在30秒左右的时候创建了150w个左右的iterator对象,
然后gc掉,
这是因为有很多对象的update里面会对自己持有的ArrayList进行迭代(这个操作目前看是不可避免的,暂时没有考虑减少操作次数),
都是用的iterator,方法完成后会造成很多iterator在内存里面等待被回收
看了下ArrayList的源码,iterator()方法都是直接new了一个对象出来,
都知道在Java里面new是比较耗资源的一种操作
那么,我考虑把iterator的迭代访问改为for循环访问,
可以避免创建这么多对象,但是for的话会不会比iterator迭代的效率低,
造成得不偿失?

或者能考虑的方案是自己写一个ArrayList然后做一个iterator对象池?
这样做很复杂而且会额外造成很多开销,对象池的维护什么的

另外我想请问一下30秒左右执行一次非Full GC这算正常吗?
------最佳解决方案--------------------
对于ArrayList来说,for循环肯定是比iterator快,因为直接用数组下标去取得元素,用iterator需要先调用方法hasNext去判断是否有元素,然后才进一步处理。hasNext里还有进一步的逻辑处理
------其他解决方案--------------------
引用:
对于ArrayList来说,for循环肯定是比iterator快,因为直接用数组下标去取得元素,用iterator需要先调用方法hasNext去判断是否有元素,然后才进一步处理。hasNext里还有进一步的逻辑处理


建议LZ用增强循环吧。

------其他解决方案--------------------
foreach
------其他解决方案--------------------
引用:
引用:对于ArrayList来说,for循环肯定是比iterator快,因为直接用数组下标去取得元素,用iterator需要先调用方法hasNext去判断是否有元素,然后才进一步处理。hasNext里还有进一步的逻辑处理

建议LZ用增强循环吧。


引用:
foreach

谢谢你们的建议..但是需要在循环中删除元素,foreach做不到这点吧,
可以考虑的方案是把要删除的元素放在另外一个集合中,foreach完了再来统一删除
这又会增加额外的开销。。
------其他解决方案--------------------
引用:
对于ArrayList来说,for循环肯定是比iterator快,因为直接用数组下标去取得元素,用iterator需要先调用方法hasNext去判断是否有元素,然后才进一步处理。hasNext里还有进一步的逻辑处理

嗯,谢谢哦,我先改一部分看看效率有没有变化看
------其他解决方案--------------------
今天做了个简单的测试,如果不删除数据只是访问ArrayList,普通的for循环效率比iterator高1/3的样子,如果要删除,在整个集合全部遍历删除的情况下,性能大概是1:1
foreach很悲剧的是..其实就是iterator..可以把class反编译过来看看,跟用iterator木有区别..
明天开始优化改成for遍历,结贴,谢谢各位!