首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

请问一个关于Iterator的有关问题

2012-12-16 
请教一个关于Iterator的问题我想问下,如果把对ArrayList的用iterator遍历改为for(int i0i size i ++),

请教一个关于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遍历,结贴,谢谢各位!

热点排行