在一次采访中,我被问到在循环中使用迭代器有什么好处,或者在循环中使用有什么好处
有人能回答这个问题吗
首先,有两种for循环,它们的行为非常不同。一种是使用指数:
用于(int i=0;i<;list.size();i++){
事物t=list.get(i);
...
}
这种循环并不总是可能的。例如,列表有索引,但集合没有,因为它们是无序集合
另一个,foreach循环在幕后使用迭代器:
(物品:列表)的
{
...
}
这适用于所有类型的Iterable集合(或数组)
最后,您可以使用迭代器,它也适用于任何Iterable:
for(迭代器<;Thing>;it=list.Iterator();it.hasNext();){
事物t=it.next();
...
}
所以你实际上有3个循环要比较
您可以用不同的术语对它们进行比较:性能、可读性、易出错性、能力
迭代器可以完成foreach循环无法完成的事情。例如,如果迭代器支持,可以在迭代时删除元素:
for(迭代器<;Thing>;it=list.Iterator();it.hasNext();){
事物t=it.next();
如果(应该)删除(事物){
it.remove();
}
}
列表还提供可以双向迭代的迭代器。foreach循环只从开始到结束进行迭代
但是迭代器更危险,可读性更低。当foreach循环是您所需要的全部时,它是最可读的解决方案。使用迭代器,您可以执行以下操作,这将是一个bug:
for(迭代器<;Thing>;it=list.Iterator();it.hasNext();){
System.out.println(it.next().getFoo());
System.out.println(it.next().getBar());
}
foreach循环不允许发生这样的错误
对于由数组支持的集合,使用索引访问元素的效率稍高一些。但是如果您改变主意,使用LinkedList而不是ArrayList,性能会突然变得糟糕,因为每次访问list.get(i),链表必须循环遍历其所有元素,直到第i个元素。迭代器(以及foreach循环)没有这个问题。它总是使用最佳方式遍历给定集合的元素,因为集合本身有自己的迭代器实现
我的一般经验法则是:使用foreach循环,除非您真的需要迭代器的功能。当我需要访问循环中的索引时,我只使用带有数组的索引的for循环