for (int i = 0; i < list.size(); i++) { Thing t = list.get(i); ...}
这种循环并非总是可能的。例如,列表具有索引,而集合没有索引,因为它们是无序集合。
另一个foreach循环在幕后使用Iterator:
for (Thing thing : list) { ...}
这适用于每种Iterable集合(或数组)
最后,您可以使用Iterator,它也可以与任何Iterable一起使用:
for (Iterator<Thing> it = list.iterator(); it.hasNext(); ) { Thing t = it.next(); ...}
因此,实际上您有3个循环要比较。
您可以用不同的术语来比较它们:性能,可读性,易错性,功能。
迭代器可以执行foreach循环无法执行的 *** 作。例如,如果迭代器支持,则可以在迭代时删除元素:
for (Iterator<Thing> it = list.iterator(); it.hasNext(); ) { Thing t = it.next(); if (shouldBeDeleted(thing) { it.remove(); }}
列表还提供可以双向迭代的迭代器。foreach循环仅从头到尾进行迭代。
但是,迭代器更危险,可读性更差。当您只需要一个foreach循环时,它就是最易读的解决方案。使用迭代器,您可以执行以下 *** 作,这将是一个错误:
for (Iterator<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循环)不存在此问题。它始终使用最佳方式来遍历给定集合的元素,因为集合本身具有自己的Iterator实现。
我的一般经验法则是:使用foreach循环,除非您确实需要Iterator的功能。当我需要访问循环内的索引时,我只会使用带有数组索引的for循环。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)