以下内容整理自互联网,仅用于个人学习
for循环
- for需要获取容器大小,如果计算大小比较耗时,那么for循环效率会很低。
- for循环是根据容器大小防止越界,因此每次循环需要进行一次比较。
foreach
ForEach 编译成字节码之后,使用的是迭代器实现的,所以本质上是通过迭代器遍历的。
将foreach代码反编译后得到的代码如下:
public static void testForEach(List list) {
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Object t = iterator.next();
Object obj = t;
}
}
可以看到,只比迭代器遍历多了生成中间变量这一步,因此性能也略微下降了一些。
- 无需获取容器大小。
- 需要创建额外的迭代器变量。
- 遍历期间得到的是对象,没有索引位置信息,因此没办法将指定索引位置对象替换为新对象,也就是不能赋值。
效率对比
由于for循环的特性,每次循环都会进行比较,所以效率上不如foreach。
但这个结论并不是绝对的,选择for或者foreach,还要考虑几点:
- 如果只是读数据,优先选择foreach,因为效率高,而且代码简单,方便;
- 如果要写数据,即替换指定索引位置处的对象,就只能选择for了。