java - Java 中传统 for 循环与 Iterator/foreach 的性能对比

标签 java map iterator arraylist for-loop

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

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

最佳答案

假设这就是你的意思:

// 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),迭代器更快。对于数组和 ArrayList,性能差异应该可以忽略不计。

编辑:我相信微基准测试是万恶之源,就像早期优化一样。但话又说回来,我认为对这些非常微不足道的事情的含义有一种感觉是件好事。因此我运行了 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 倍)。哇! :) 因此,最好使用迭代器(显式或隐式地使用每个迭代器),特别是如果您不知道要处理的列表的类型和大小。

关于java - Java 中传统 for 循环与 Iterator/foreach 的性能对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1879255/

相关文章:

java - Android Spinner 空指针

C++ 迭代器 - 推导维度

c++ - 遍历树中的节点

java - Heroku slug 大小计算?

java - 获取 float[] 作为 FloatBuffer 类

Java:创建多个(重复的)按钮执行相同的操作但对自己执行

c++ - 接口(interface)和协变问题

google-maps - 如何从Google map 获取最近的重要城镇?

android: 二进制 XML 文件第 9 行:类 fragment 膨胀错误

list - 如何将函数映射到 Haskell 中的多级列表