Java 中传统 for 循环与 Iterator/foreach 的性能 [英] Performance of traditional for loop vs Iterator/foreach in Java

查看:35
本文介绍了Java 中传统 for 循环与 Iterator/foreach 的性能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在遍历 ArrayList、HashMap 和其他集合时比较传统的 for 循环和 Iterator 是否有任何性能测试结果可用?

Is there any performance testing results available in comparing traditional for loop vs Iterator while traversing a ArrayList,HashMap and other collections?

或者只是为什么我应该在 for 循环上使用迭代器,反之亦然?

Or simply why should I use Iterator over for loop or vice versa?

推荐答案

假设这就是你的意思:

// traditional for loop
for (int i = 0; i < collection.size(); i++) {
  T obj = collection.get(i);
  // snip
}

// using iterator
Iterator<T> iter = collection.iterator();
while (iter.hasNext()) {
  T obj = iter.next();
  // snip
}

// using iterator internally (confirm it yourself using javap -c)
for (T obj : collection) {
   // snip
}

对于没有随机访问的集合(例如 TreeSet、HashMap、LinkedList),迭代器更快.对于数组和 ArrayLists,性能差异应该可以忽略不计.

Iterator is faster for collections with no random access (e.g. TreeSet, HashMap, LinkedList). For arrays and ArrayLists, performance differences should be negligible.

我相信微基准测试是邪恶的根源,就像早期优化一样.但话又说回来,我认为对这些微不足道的事情的影响有一种感觉是件好事.因此我运行了一个小测试:

I believe that micro-benchmarking is root of pretty much evil, just like early optimization. But then again, I think it's good to have a feeling for the implications of such quite trivial things. Hence I've run a small test:

  • 分别迭代 LinkedList 和 ArrayList
  • 有 100,000 个随机"字符串
  • 总结它们的长度(只是为了避免编译器优化整个循环)
  • 使用所有 3 种循环样式(迭代器、for each、for with counter)

对于 LinkedList,除了for with counter"之外的所有结果都相似.所有其他五个都花费了不到 20 毫秒的时间来遍历整个列表.在 LinkedList 上使用 list.get(i) 100,000 次需要 2 多分钟 (!) 才能完成(慢 60,000 倍).哇!:) 因此最好使用迭代器(显式或隐式用于每个),尤其是当您不知道要处理的列表的类型和大小时.

Results are similar for all but "for with counter" with LinkedList. All the other five took less than 20 milliseconds to iterate over the whole list. Using list.get(i) on a LinkedList 100,000 times took more than 2 minutes (!) to complete (60,000 times slower). Wow! :) Hence it's best to use an iterator (explicitly or implicitly using for each), especially if you don't know what type and size of list your dealing with.

这篇关于Java 中传统 for 循环与 Iterator/foreach 的性能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆