测试for,foreach和Iterator遍历效率

  1. 对于数组而言,for和foreach遍历效率相差不大。
  2. 对于集合而言
    • 对大多数的集合,foreach比起传统的for循环稍有性能优势但差别不大,因为它对索引的边界值只计算一次。而在对多个集合进行嵌套式迭代时优势会更明显。
    • 但是测试了一下LinkedList,发现这玩意有点特殊:foreach和Iterator遍历效率相差不大(在我的机器上,测试用例用时几乎都在10,000,000纳秒左右),但是for只用了3,000,000纳秒左右)。
  3. Effective Java中建议,一般情况下使用foreach进行循环,因为其在简洁性和预防Bug方面有着传统for循环无法比拟的优势,并且没有性能损失。但是除了一下三种情况:
    • 过滤:如果需要遍历集合,并删除选定的元素,就需要使用显式的迭代器,以便可以调用它的remove方法。
    • 转换:如果需要遍历列表或数组,并取代它部分或者全部的元素值,就需要列表迭代器ListIterator或者数组索引,以便设定元素的值。(如果直接更改它引用对象的值的话,也可以使用Iterator,前提是符合按引用传递的原则,Iterator的元素为基本数据类型就不会按引用传递,或者它们的包装类,因为是不可变类,也不符合要求。)
    • 平行迭代:如果需要并行地遍历多个集合,就需要显式的控制迭代器或者索引变量,以便所有迭代器或者索引变量都可以得到同步前移。

测试用例:

import java.util.*;
class Test{
    private String a;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

}
public class ForAndForeach {
    public static void main(String[] args) {
//      double[] a = new double[10000000];
//      List<Integer> a = new ArrayList<Integer>();
        List<Integer> a = new LinkedList<Integer>();
//      for(int i=0; i<a.length; i++){
//          a[i] = Math.random()*100;
//      }
        for(int i=0; i<1000000; i++){
            a.add(i);
        }

        long startTime = System.nanoTime();
//      for(double s : a){
//      
//      }
//      for(Integer s : a){
//          s = "c";
//      }
//      for(int i=0; i<a.length; i++){
//          
//      }
//      for(int i=0; i<a.size(); i++){
//          
//      }
//      Iterator<Integer> it = a.iterator();
        /*while(it.hasNext()){
            Integer s = it.next();
        }*/
        for(Integer s : a){

        }
        long endTime = System.nanoTime();
        System.out.println(endTime - startTime);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值