Java循环问题

无尘45f 2007-08-07 02:31:53
请问一下 遍历ArrayList的时候
for循环和Iterator有什么区别
可否详细点
...全文
310 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
liming1983 2007-09-04
  • 打赏
  • 举报
回复
针对不同的数据集,由于其实现方式的不同,可能造成在根据索引查找数据时在性能上造成很重大的差异。如基于数组索引的ArrayList和基于链表的LinkedList。同是List,但是在类似get(0)这样的操作上的性能差异是非常大的。LinkedList会慢很多。
而迭代器则是为解决这个问题而产生的,它提供了一种通用的最简单和相对优化的方式遍历数据集。对于ArrayList,迭代器会用其效率高的根据索引取值,而针对LinkedList,则会直接取当前对象的下一个链接对象。
所以,其实针对ArrayList,用for是相对更快的。但是Iterator则更加通用。
bit1010 2007-09-03
  • 打赏
  • 举报
回复
当然有区别,使用Iterator其实是在使用迭代器模式。

在你现在的这个例子中,可以实际的获取到你的集合数据结构,但是如果你写了一个方法供别人
比如 List getAList() {
list.add("a");
list.add("b");
return list;//假如list是实例变量。
}

这样的话,别人再获得list对象后,可以再add内容,这样就会影响到你的list。


因此,上面的方法需要改为:

List getAList() {
list.add("a");
list.add("b");
return list.clone();//假如list是实例变量。
}

上面的方法有如下问题:
(1)使用clone,clone是一个费时的操作,并且往往容易出错。
(2)向你的API使用者提供了你的内部实现,如果以后你要把List改为Set,你对你的用户来说,你的API是失败的,别说增加一个方法getASet.

这时候,就可以把方法写成:

Iterator getAIterator() {
list.add("a");
list.add("b");
return list.iterator;//假如list是实例变量。
}


  • 打赏
  • 举报
回复
使用 foreach 循环就更好了,既清楚,又好理解。
IT码农人 2007-09-03
  • 打赏
  • 举报
回复
public static int mytst(Collection c)
{
Iterator itr = c.iterator();
while(itr.hasNext())
{
...
}

for(Iterator itr1 = c.iterator(); itr.hasNext(); )
{
...
}
}
两者没有本质区别
free510 2007-09-02
  • 打赏
  • 举报
回复
用迭代器你可以不用知道arraylist中的结构,隐藏了一些东西
zdjray 2007-08-08
  • 打赏
  • 举报
回复
个人理解就是for从里面来看,iterator 从外面来看
iterator可以不用关心里面是怎么得到下一个的,可以很复杂
但是iterator一般用链表实现,可能性能相对低一点点
无尘45f 2007-08-07
  • 打赏
  • 举报
回复
但是在公司,比较有经验的都说尽量用迭代器,不知道什么原因
chenyifei211 2007-08-07
  • 打赏
  • 举报
回复
另外Iterator即迭代器,可以实现不经重写就能同各种容器一同工作,能让客户程序员在不知道,不关心他所处理的是什么样的底层序列结构情况下就能在一个对象序列中前后移动,选取其中对象也就是说无论是arraylist或别的,使用Iterator的情况下不用去关心
chenyifei211 2007-08-07
  • 打赏
  • 举报
回复
遍历的话这两种方式应该都可以,区别的话应该也没有什么吧,我感觉效率应该也是差不多的吧

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧