Java中迭代列表中数据时几种循环写法的效率比较
2011-08-10 13:23
591 查看
Java中经常会用到迭代列表数据的情况,本文针对几种常用的写法进行效率比较。虽然网上已经有了类似的文章,但是对他们的结论并不认同。
一般人都会认为第二种写法效率高。
2.foreach:
这是一种简洁的写法,只能对列表进行读取,无法修改。
3.while:
4.迭代:
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
耗时是普通for循环的2倍以上。个人理解它的实现应该和iterator相似。
2. list.size()的开销很小:
list.size()次数多少对效率基本没有影响。查看ArrayList的实现就会发现,size()方法的只是返回了对象内的长度属性,并没有其它计算,所以只存在函数调用的开销。
3. 列表的get()方法开销不少
应该主要是检测数据合法性时产生的。
将执行次数增加100万倍,这时可以看出结果基本相等,并没有明显的差异。说明:
4. 数组length也没有开销
可见数组长度并不是每次执行的时候都要计算的。联想一下Java创建数组的时候要求必须指定数组的长度,编译处理的时候显然没有把这个值抛弃掉。
网上有一篇类似的文章,它居然得出了一个foreach执行效率最高的结论。看一下它的测试代码就会发现一个要命的问题,它居然在执行每次循环的时候调用了System.out.print()方法将数组内容输出,难道他不知道这个操作耗时非常大吗,这样计算出的结果有什么用处呢。
常见的实现方法:
1.for循环:for(int i = 0; i < list.size(); i++) for(int i = 0, size = list.size(); i < size; i++)
一般人都会认为第二种写法效率高。
2.foreach:
for(Object obj : list)
这是一种简洁的写法,只能对列表进行读取,无法修改。
3.while:
int size = list.size(); while(size-- > 0)
4.迭代:
Object iter = list.iterator(); while(iter.hasNext()) { iter.next(); }
测试代码:
针对以上几种方法编写的测试代码。public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); int runTime = 1000;//执行次数 for (int i = 0; i < 1000 * 1000; i++) { list.add(i); } int size = list.size(); long currTime = System.currentTimeMillis();//开始分析前的系统时间 //基本的for for(int j = 0; j < runTime; j++) { for (int i = 0; i < size; i++) { list.get(i); } } long time1 = System.currentTimeMillis(); //foreach for(int j = 0; j < runTime; j++) { for (Integer integer : list) { } } long time2 = System.currentTimeMillis(); for(int j = 0; j < runTime; j++) { //while int i = 0 ; while(i < size){ list.get(i++); } } long time3 = System.currentTimeMillis(); for(int j = 0; j < runTime; j++) {//普通for循环 for (int i = 0; i < list.size(); i++) { list.get(i); } } long time4 = System.currentTimeMillis(); for(int j = 0; j < runTime; j++) {//迭代 Iterator<Integer> iter = list.iterator(); while(iter.hasNext()) { iter.next(); } } long time5 = System.currentTimeMillis(); long time = 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()方法将数组内容输出,难道他不知道这个操作耗时非常大吗,这样计算出的结果有什么用处呢。
相关文章推荐
- Java中迭代列表中数据时几种循环写法的效率比较
- Java中迭代列表中数据时几种循环写法的效率比较
- JAVA中迭代列表中数据时的几种循环写法
- 对300万一张表数据,用游标进行循环,不同写法的效率比较
- 对300万一张表数据,用游标进行循环,不同写法的效率比较
- 对300万一张表数据,用游标进行循环,不同写法的效率比较
- Java从控制台读取数据,输入流System.in的几种方法效率比较
- 对300万一张表数据,用游标进行循环,不同写法的效率比较
- Python【基础:数据类型和变量 字符串和编码 list和tuple 条件判断 循环 dict和set】注意事项(与java,c比较)
- Java for循环几种写法整理
- javaweb-react的入门遇到的问题三:ajax获取数据与循环处理放入列表
- 数据列表过滤重复值几种方法的性能比较
- Java中的几种循环写法
- mysql批量insert数据的几种方法的效率比较
- 云星数据---Scala实战系列(精品版)】:Scala入门教程016-Scala实战源码-Scala 判断语句 、循环与java的比较
- C++几种循环效率比较
- java读取写入文件几种方式效率比较
- [测试]java IO写入文件效率——几种方法比较
- java IO写入文件效率——几种方法比较
- C#框架提供的几种数据结构对单值查找的效率比较