java中几种循环的效率高_Java中迭代列表中数据时几种循环写法的效率比较

Java中经常会用到迭代列表数据的情况,本文针对几种常用的写法进行效率比较。虽然网上已经有了类似的文章,但是对他们的结论并不认同。

常见的实现方法:

1.for循环:

for(inti =0; i 

for(inti =0, size = list.size(); i 

一般人都会认为第二种写法效率高。

2.foreach:

for(Object obj : list)

这是一种简洁的写法,只能对列表进行读取,无法修改。

3.while:

intsize = list.size();

while(size-- >0)

4.迭代:

Object iter = list.iterator();

while(iter.hasNext()) {

iter.next();

}

测试代码:

针对以上几种方法编写的测试代码。

publicstaticvoidmain(String[] args) {

List list = newArrayList();

intrunTime =1000;//执行次数

for(inti =0; i <1000*1000; i++) {

list.add(i);

}

intsize = list.size();

longcurrTime = System.currentTimeMillis();//开始分析前的系统时间

//基本的for

for(intj =0; j 

for(inti =0; i 

list.get(i);

}

}

longtime1 = System.currentTimeMillis();

//foreach

for(intj =0; j 

for(Integer integer : list) {

}

}

longtime2 = System.currentTimeMillis();

for(intj =0; j 

//while

inti =0;

while(i 

list.get(i++);

}

}

longtime3 = System.currentTimeMillis();

for(intj =0; j 

for(inti =0; i 

list.get(i);

}

}

longtime4 = System.currentTimeMillis();

for(intj =0; j 

Iterator iter = list.iterator();

while(iter.hasNext()) {

iter.next();

}

}

longtime5 = System.currentTimeMillis();

longtime = time1 - currTime ;

System.out.print("use for:"+ time);

time = time2 - time1;

System.out.print("\tuse foreach:"+ time);

time = time3 - time2;

System.out.print("\tuse while:"+ time);

time = time4 - time3;

System.out.print("\tuse for2:"+ time);

time = time5 - time4;

System.out.print("\tuse iterator:"+ time);

System.out.println();

}

输出结果(JDK1.6):

1.

use for:8695        use foreach:17091        use while:6867        use for2:7741        use iterator:14144

2.

use for:8432        use foreach:18126        use while:6905        use for2:7893        use iterator:13976

3.

use for:8584        use foreach:17177        use while:6875        use for2:7707        use iterator:14345

结论:

1.针对列表的 foreach的效率是最低:

耗时是普通for循环的2倍以上。个人理解它的实现应该和iterator相似。

2. list.size()的开销很小:

list.size()次数多少对效率基本没有影响。查看ArrayList的实现就会发现,size()方法的只是返回了对象内的长度属性,并没有其它计算,所以只存在函数调用的开销。

对数组的测试:

将代码中的列表list换做数组再进行测试(iterator不适用),发现耗时基本为0。说明:

3. 列表的get()方法开销不少

应该主要是检测数据合法性时产生的。

将执行次数增加100万倍,这时可以看出结果基本相等,并没有明显的差异。说明:

4. 数组length也没有开销

可见数组长度并不是每次执行的时候都要计算的。联想一下Java创建数组的时候要求必须指定数组的长度,编译处理的时候显然没有把这个值抛弃掉。

网上有一篇类似的文章,它居然得出了一个foreach执行效率最高的结论。看一下它的测试代码就会发现一个要命的问题,它居然在执行每次循环的时候调用了System.out.print()方法将数组内容输出,难道他不知道这个操作耗时非常大吗,这样计算出的结果有什么用处呢。

后续有很多开发填坑的文章发布,如果对你有帮助,请支持和加关注一下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值