`

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

    博客分类:
  • java
 
阅读更多

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

常见的实现方法:

1.for循环:

 

  1. for(int i = 0; i < list.size(); i++)  
  2. for(int i = 0, size = list.size(); i < size; i++)  

 

 

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

2.foreach:

 

  1. for(Object obj : list)  


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

 

 

3.while:

 

  1. int size = list.size();  
  2. while(size-- > 0)  


4.迭代:

 

 

  1. Object iter = list.iterator();  
  2. while(iter.hasNext()) {  
  3.   iter.next();  
  4. }  

 

 

测试代码:

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

  1. public static void main(String[] args) {  
  2.       List<Integer> list = new ArrayList<Integer>();  
  3.   
  4.       int runTime = 1000;//执行次数  
  5.       for (int i = 0; i < 1000 * 1000; i++) {  
  6.           list.add(i);  
  7.       }  
  8.       int size = list.size();  
  9.       long currTime = System.currentTimeMillis();//开始分析前的系统时间  
  10.       //基本的for              
  11.       for(int j = 0; j < runTime; j++) {  
  12.           for (int i = 0; i < size; i++) {  
  13.               list.get(i);  
  14.           }  
  15.       }  
  16.       long time1 = System.currentTimeMillis();  
  17.   
  18.       //foreach  
  19.       for(int j = 0; j < runTime; j++) {  
  20.           for (Integer integer : list) {  
  21.           }  
  22.       }  
  23.       long time2 = System.currentTimeMillis();  
  24.   
  25.       for(int j = 0; j < runTime; j++) {  
  26.           //while  
  27.           int i = 0 ;  
  28.           while(i < size){  
  29.               list.get(i++);  
  30.           }  
  31.       }  
  32.       long time3 = System.currentTimeMillis();  
  33.   
  34.       for(int j = 0; j < runTime; j++) {//普通for循环  
  35.           for (int i = 0; i < list.size(); i++) {  
  36.               list.get(i);  
  37.           }  
  38.       }  
  39.       long time4 = System.currentTimeMillis();  
  40.   
  41.       for(int j = 0; j < runTime; j++) {//迭代  
  42.           Iterator<Integer> iter = list.iterator();  
  43.           while(iter.hasNext()) {  
  44.               iter.next();  
  45.           }  
  46.       }  
  47.       long time5 = System.currentTimeMillis();  
  48.   
  49.       long time = time1 - currTime ;  
  50.       System.out.print("use for:" + time);  
  51.       time = time2 - time1;  
  52.       System.out.print("\tuse foreach:" + time);  
  53.       time = time3 - time2;  
  54.       System.out.print("\tuse while:" + time);  
  55.       time = time4 - time3;  
  56.       System.out.print("\tuse for2:" + time);  
  57.       time = time5 - time4;  
  58.       System.out.print("\tuse iterator:" + time);  
  59.       System.out.println();  
  60.   }  

 

 

输出结果(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()方法将数组内容输出,难道他不知道这个操作耗时非常大吗,这样计算出的结果有什么用处呢。

 

来自:http://blog.csdn.net/waynell/article/details/6674959

分享到:
评论

相关推荐

    Java for循环几种写法整理

    以下是对Java for循环几种写法的详细说明: 1. 传统for循环: 传统for循环是最基础的形式,通常用于遍历数组。例如: ```java int[] integers = {1, 2, 3, 4}; for (int j = 0; j ; j++) { int i = integers[j...

    Java String转int还有其它几种写法.docx

    标题提到的"Java String转int还有其它几种写法",描述中提到了两种常见方法:`Integer.valueOf()`和`Integer.parseInt()`。以下是这些方法的详细解释: 1. **`Integer.valueOf()`方法**: `Integer.valueOf()`是...

    优质java课件 java程序设计教程(第6版)05.深入的条件判断和循环(共28页).ppt

    Java程序设计教程第六版深入探讨了条件判断和循环机制,这是编程中不可或缺的基本概念,尤其在Java这样的面向对象编程语言中。本章内容主要涵盖了以下几个关键知识点: 1. **switch语句**:switch语句是一种多分支...

    java内功修炼.pdf

    与传统for循环相比,增强for循环写法更为直观,能够直接迭代集合中的每个元素,而无需使用索引或迭代器。例如,遍历一个List集合的代码可以简化为`for (String str : strList) { System.out.println(str); }`,这种...

    JAVA编程题全集(50题含答案)

    成绩等级划分是一种常见的数据处理方式,用于根据分数将学生的表现分为不同的等级,便于评估和比较学生的学术成就。 **代码解析**: ```java import java.util.Scanner; public class lianxi05 { public static ...

    面试题经典

    java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? - 创建线程有两种主要方式:继承`Thread`类或实现`Runnable`接口。 - 同步方法使用`synchronized`关键字。 -...

    mybatis中批量插入的两种方式(高效插入)

    在处理大量数据时,批量插入是一种提高性能的有效策略。本文将深入探讨MyBatis中实现批量插入的两种高效方式。 ### 1. MyBatis `foreach` 标签 `foreach` 是MyBatis中用于在SQL语句中迭代集合的标签,特别适合构建...

    EL and JSTL 中文教程(选自 JSP2.0技术手册)

    对于这种形式的表达式,有几种可能的情况: - 如果 `expr-a` 的值为 `null`,那么整个表达式的结果也为 `null`。 - 如果 `expr-b` 的值为 `null`,同样整个表达式的结果为 `null`。 - 如果 `expr-a` 的值是一个 ...

    为什么Python中没有"a++"这种写法

    要实现类似于 C 语言中 "a++" 的效果,Python 提供了以下几种方法: 1. 单独的加法操作:`a = a + 1` 2. 使用 `+=` 赋值运算符:`a += 1` 3. 利用内置函数 `enumerate()` 对列表或迭代器进行增量操作 例如,如果你...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    Karen Morton及其团队在本书中提供了专业的方案:先掌握语言特性,再学习Oracle为提升语言效率而加入的支持特性,进而将两者综合考虑并在工作中加以应用。作者通过总结各自多年的软件开发和教学培训经验,与大家...

    经典Python面试题之Python基础篇.docx

    - **位**: 计算机中最小的数据单位,只有 0 或 1 两种状态。 - **字节**: 由 8 位组成的基本单位,通常用来表示字符或数字等信息。 #### 7. b、B、KB、MB、GB 的关系? - **b**: 位。 - **B**: 字节。 - **KB**: ...

    12i-Javascript

    4. **循环结构**:`for`循环和`while`循环是两种常用的迭代工具。`for`循环常用于已知循环次数的情况,而`while`循环则适用于满足特定条件时持续执行的场景。 5. **函数**:JavaScript中的函数是一等公民,可以作为...

Global site tag (gtag.js) - Google Analytics