java性能优化方案3——不要使用iterator()方法

3、不要使用iterator()方法
这条建议不适用于一般的场合,仅适用于在 N.O.P.E 分支深处的场景。尽管如此也应该有所了解。Java 5格式的循环写法非常的方便,以至于我们可以忘记内部的循环方法,比如:
for (String value : strings) {

// Do something useful here

}
当每次代码运行到这个循环时,如果 strings 变量是一个 Iterable 的话,代码将会自动创建一个Iterator 的实例。如果使用的是 ArrayList 的话,虚拟机会自动在堆上为对象分配3个整数类型大小的内存。
private class Itr implements Iterator {

int cursor;
int lastRet = -1;
int expectedModCount = modCount;
// ...

也可以用下面等价的循环方式来替代上面的 for 循环,仅仅是在栈上“浪费”了区区一个整形,相当划算。
int size = strings.size();
for (int i = 0; i < size; i++) {

String value : strings.get(i);
// Do something useful here

}
如果循环中字符串的值是不怎么变化,也可用数组来实现循环。
for (String value : stringArray) {

// Do something useful here

}
小结
无论是从易读写的角度来说,还是从API设计的角度来说迭代器、Iterable接口和 foreach 循环都是非常好用的。但代价是,使用它们时是会额外在堆上为每个循环子创建一个对象。如果循环要执行很多很多遍,请注意避免生成无意义的实例,最好用基本的指针循环方式来代替上述迭代器、Iterable接口和 foreach 循环。

上一篇:YARN发展和架构组件功能详解


下一篇:《基于MPLS的流量工程(修订版)》一第2章 MPLS转发基础2.1 MPLS术语表