增强型For循环(也就是常说的“For-each循环”)经常用于Iterable接口的继承收集接口上面。在这些对象里面,一个iterator被分配给对象去调用它的hasNext()和next()方法。在一个数组列表里面,你可以自己接的敷衍它,在其他的收集器里面,增强型的for循环将相当于iterator的使用。
尽管如此,下面的源代码给出了一个可以接受的增强型for循环的例子:
public class Foo { int mSplat; static Foo mArray[] = new Foo[27]; public static void zero() { int sum = 0; for (int i = 0; i < mArray.length; i++) { sum += mArray[i].mSplat; } } public static void one() { int sum = 0; Foo[] localArray = mArray; int len = localArray.length; for (int i = 0; i < len; i++) { sum += localArray[i].mSplat; } } public static void two() { int sum = 0; for (Foo a: mArray) { sum += a.mSplat; } } }
zero() 函数在每一次的循环中重新得到静态属性两次,获得数组长度一次。
one() 函数把所有的东西都变为本地变量,避免类查找属性调用
two() 函数使用Java语言的1.5版本中的for循环语句,编辑者产生的源代码考虑到了拷贝数组的引用和数组的长度到本地变量,是例遍数组比较好的方法,它在主循环中确实产生了一个额外的载入和储存过程(显然保存了“a”),相比函数one()来说,它有一点比特上的减慢和4字节的增长。
总结之后,我们可以得到:增强的for循环在数组里面表现很好,但是当和Iterable对象一起使用时要谨慎,因为这里多了一个对象的创建。